当我使用 go run main.go
运行此代码时,然后我看到这个输出:
inner: {Bar:{Baz:xyz} BarPtr:0xc0000101e0}
outer: {Bar:{Baz:} BarPtr:<nil>}
我不明白为什么在将指针传递给例程时,结构 已创建 该例程内部不能通过指针暴露在外部。
我知道我可以使用 channel 来发布在 Go 例程中创建的结构,但是我正在处理的代码需要太多额外的样板代码。如果可能的话,我想使用带有指针的 WaitGroup ,但我找不到方法,所以我想知道这是否可能?
对我来说,我应该能够通过指针公开一个内部结构,但我不确定编译器是否会默默地忽略这一点,或者我是否无法理解 Go 的一些基本特性?
package main
import (
"fmt"
"sync"
)
type Foo struct {
Bar Bar
BarPtr *Bar
}
type Bar struct {
Baz string
}
func main() {
foo := Foo{}
var wg sync.WaitGroup
// the real example has more routines, so I need a wait group
wg.Add(1)
go func(strct *Foo) {
defer wg.Done()
bar1 := Bar{
Baz: "xyz",
}
bar2 := Bar{
Baz: "abc",
}
ownFoo := Foo{
Bar: bar1,
BarPtr: &bar2,
}
fmt.Printf("inner: %+v\n", ownFoo)
strct = &ownFoo
}(&foo)
wg.Wait()
fmt.Printf("outer: %+v\n", foo)
}
最佳答案
设置 foo
的正确表达式通过指针 strct
的值是:
*strct = ownFoo
另一方面,表达式
strct = &ownFoo
设置
strct
指向ownFoo
地址的指针离开foo
值(value)不变。请记住,如果您有一个从多个 goroutine 访问的变量,并且其中至少一个正在编写/修改该变量,那么如果没有适当的同步,您的代码必然会遇到数据竞争,无论该变量是否被访问直接或通过本地指针或你有什么。
关于pointers - 使用指向外部结构的指针时如何使结构在其 Go 例程之外生存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58452427/