go - 更新全局变量的成员未反射(reflect)在全局变量中

标签 go

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

相关文章:

go - 如何从 grpc-server 流式传输结果以及如何从 goroutines grpc server-stream 返回结果以将结果传递给 api

GORM 和外键关联

go - 从 map 值追加 slice 不会影响 map

go - 如何存储一片 byte slice ?

go - 为什么指针在这个 Go 程序中失去了它的值(value)

postgresql - Go:如何使用 NamedExec() 在 Postgresql 上获取最后一个插入 ID

concurrency - 我们应该做嵌套的 goroutines 吗?

Go:解析变体 YAML

list - 如何在 Go 中获取映射键的排序列表?

c - 戈朗,围棋 : why pointer use star operator instead of &