为了账号安全,请及时绑定邮箱和手机立即绑定

更新到全局变量的成员未反映在全局变量中

更新到全局变量的成员未反映在全局变量中

Go
潇潇雨雨 2021-11-01 15:49:45
首先,我是 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 的行为,请使用指针)


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信