首先,我是Go的新手,所以我想我很明显有一些正确的方法来做我想在这里实现的目标。
我遇到的问题是,当我运行test()时,以下代码不会打印“blah”。相反,如果打印为零,即使首先执行main()。为什么更新全局变量的成员属性不能在不同的函数中反映出来?
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)
}
}
答案 0 :(得分:1)
如果你有:
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的行为使用指针)