我希望在map[string]string
和自定义Go结构之间同步状态,并得出结论,解析它的最简单方法是对字段使用fmt.Sscan
。
不幸的是,直接方法无效(playground):
var S struct{ I int }
f := reflect.Indirect(reflect.ValueOf(&S)).Field(0)
fmt.Sscan("10", f.Interface())
fmt.Println(S) // {0}
引入中间值并使用Set()
解决了这个问题:
nv := reflect.New(f.Type())
fmt.Sscan("10", nv.Interface())
f.Set(reflect.Indirect(nv))
fmt.Println(S) // {10}
我想知道为什么第一种方法不起作用。 Isn&#t; t Interface()
是否会返回对某个字段的引用,该字段可用于更改其值?
答案 0 :(得分:2)
Interface()
方法返回值,而不是对值的引用。获取字段的地址(通过调用Addr()
)直接扫描到字段:
var S struct{ I int }
f := reflect.Indirect(reflect.ValueOf(&S)).Field(0)
fmt.Sscan("10", f.Addr().Interface())
fmt.Println(S) // {0}