Golang interface{} 类型误解
使用 interface{} 类型作为函数参数时,开发者经常会遇到意想不到的行为,尤其是当通过 json.Unmarshal 与 JSON 数据交互。
问题:
在 Go 中,interface{} 是一种可以保存任何值和类型的类型。然而,它通常被误解为无类型容器。这种误解会在以下情况下出现:
func test(i interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, &i) fmt.Println(i) } func main() { test(Test{}) }
预期行为:
此代码尝试将 JSON 数据解组到测试结构中。但是,它会导致结构体意外转换为 map[string]interface{} 类型。
解释:
json.Unmarshal 无法将 JSON 解组为非指针值。由于 i 是一个持有 Test 结构的接口{},因此它作为地址 (&i) 传递以允许修改。但是,json.Unmarshal 将interface{} 指针视为指向包含Test 结构的interface{} 值的指针。无法解组为非指针,它默认为解组的 JSON 创建一个新的 map[string]interface{} 值。
正确的方法:
为了解决这个误解,请考虑以下几点场景:
func test(i *interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, i) fmt.Println(*i) } func main() { var i *Test test(&i) }
解释:
结论:
interface{} 是一种可以保存任何值的类型,但它不仅仅是一个任何类型的占位符。为了避免意外行为,在使用 interface{} 作为函数参数时,请正确处理指针,尤其是在 JSON 操作中。
以上是在使用 Go 的'interface{}”和'json.Unmarshal”时,如何避免意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!