我想在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}
我不知道为什么第一种方法行不通。
Interface()
是否返回对字段的引用,该引用可用于更改其值? 最佳答案
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}
https://play.golang.org/p/6_4DjiFZB2
关于go - 通过fmt.Sscan设置结构的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46265834/