更新为全局变量的成员不反映全局变量

时间:2015-08-17 15:24:38

标签: go

首先,我是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)
    }
}

1 个答案:

答案 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的行为使用指针)