通过fmt.Sscan设置结构的值

时间:2017-09-17 15:37:09

标签: go reflection

我希望在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()是否会返回对某个字段的引用,该字段可用于更改其值?

1 个答案:

答案 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}

https://play.golang.org/p/6_4DjiFZB2