通过反射将字符串分配给结构



我有一个结构,我希望在其中使用反射将一个字符串动态更改为另一个字符串。我的问题是,新字符串是在堆栈上创建的,因此Set((方法会死机。

这对我来说很有意义,但我不知道如何修复它。我不确定将字符串声明为可寻址的简单方法,也不确定是否有不同的反射技术可以使用。

type MyStruct struct {
SomeField string
}
func main() {
myStruct := MyStruct{"initial"}
hello := "hello world"

field := reflect.ValueOf(myStruct).FieldByName("SomeField")
helloValue := reflect.ValueOf(hello)
fmt.Printf("hello is on the stack, canAddr is %vn", helloValue.CanAddr())

// This will panic because canAddr is false
field.Set(helloValue)
}

https://play.golang.org/p/ghUgiQfKXhk

go错误有点用词不当。问题出在结构上,而不是字符串上。

问题出在这一行:field := reflect.ValueOf(myStruct).FieldByName("SomeField")调用ValueOf传递一个副本(在本例中为myStruct(。由于更改副本不会更改myStruct,因此请恐慌(如果是神秘的,则会有所帮助(。见[第三反射定律](https://blog.golang.org/laws-of-reflection#TOC_8)

将此行更改为field := reflect.ValueOf(&myStruct).Elem().FieldByName("SomeField")可修复错误(注意&取地址,然后用Elem((取消引用(

当然,我只是在发布问题后才知道这一点,但希望它能帮助其他

最新更新