我想在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/

10-17 02:13