首先,我是 Go 的新手,所以我想对我来说很明显有一些正确的方法可以实现我在这里想要实现的目标。
我遇到的问题是当我运行 test() 时,以下代码不会打印“blah”。相反,即使 main() 首先执行,如果打印出 nil。为什么更新全局变量的成员属性不会在不同的函数中反射(reflect)出来?
var GlobalMe SomeType
func main() {
for _,member := range GlobalMe.Members {
member.SomeProperty = "blah"
}
test()
}
func test() {
for _,member := range GlobalMe.Members {
fmt.Println("value:", member.SomeProperty)
}
}
最佳答案
如果你有:
type SomeMemberType struct {
SomeProperty string
}
type SomeType struct {
Members []SomeMemberType
}
var GlobalMe SomeType
只需将 SomeType
更改为:
type SomeType struct {
Members []*SomeMemberType
}
人们常常觉得这不符合直觉,但在处理交易时通常是有道理的 具有更多基本类型:
xs := []int{1,2,3}
for _, x := range xs {
x = 4
}
// xs is still {1,2,3}
这实际上没有编译,但如果编译了,xs
也不会改变。如果你想要
要修改原件,您必须执行以下操作:
xs := []int{1,2,3}
for i := range xs {
xs[i] = 4
}
// xs is now {4,4,4}
这种行为在大多数编程语言中都很常见。通过对结构做同样的事情,Go 只是更明确一点。 (所以如果你想要类似 java 的行为使用指针)
关于go - 更新全局变量的成员未反射(reflect)在全局变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32054113/