首先,我是 Go 的新手,所以我想对我来说很明显有一些正确的方法可以完成我在这里想要实现的目标。我遇到的问题是,当我运行 test() 时,以下代码不会打印“blah”。相反,如果打印 nil,即使 main() 首先执行。为什么全局变量的成员属性的更新不会在不同的函数中反映在自身上?var GlobalMe SomeTypefunc main() { for _,member := range GlobalMe.Members { member.SomeProperty = "blah" } test()}func test() { for _,member := range GlobalMe.Members { fmt.Println("value:", member.SomeProperty) }}
1 回答
不负相思意
TA贡献1777条经验 获得超10个赞
如果你有:
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 的行为,请使用指针)
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报
0/150
提交
取消