【发布时间】:2021-09-27 07:15:31
【问题描述】:
我有一个结构,我希望使用反射将一个字符串动态更改为另一个字符串。我的问题是新字符串是在堆栈上创建的,因此 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 %v\n", helloValue.CanAddr())
// This will panic because canAddr is false
field.Set(helloValue)
}
【问题讨论】:
-
您不能制作不可寻址、可寻址的东西(虽然它可能是堆栈分配的,但从语言的角度来看,这与此无关)。但是,您可以使用指向要寻址的值的指针,在这种情况下是
myStruct,而不是hello。
标签: go reflection heap-memory