2 回答
TA贡献1818条经验 获得超8个赞
这个答案很好地解释了为什么你会得到例外。
你应该做什么:
当encoding/json包遇到实现Marshaler接口的类型时,它使用该类型的MarshalJSON()
方法而不是默认的封送处理代码将对象转换为 JSON。类似地,在解码 JSON 对象时,它将测试对象是否实现了Unmarshaler接口,如果是,它将使用该UnmarshalJSON()
方法而不是默认的解组行为。
我的解决方案是在 上实现UnmarshalJSON方法*ConfigurationData
,方法Load
应该接受Unmarshaler接口而不是interface{}
.
您可以在此处阅读有关技术的更多信息:https ://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/
然后你会在从文件中读取b 的方法json.Unmarshal(b, &config)
中做简单的事情。Load
[]byte
TA贡献1845条经验 获得超8个赞
根据json.Unmarshall 上的文档,解组为接口值将解组为预定义类型列表之一的新结构:
为了将 JSON 解组为接口值,Unmarshal 将其中一个存储在接口值中:
bool, for JSON booleans
float64, for JSON numbers
string, for JSON
strings []interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
在您的例子中,选择的类型是map[string]interface{}. 在您的函数中,指向新解组结构的指针存储在配置参数中并返回。发生恐慌是因为返回值的类型不是您声明的类型。
- 2 回答
- 0 关注
- 87 浏览
添加回答
举报