pointers - 使用指向外部结构的指针时如何使结构在其 Go 例程之外生存

标签 pointers go struct goroutine

当我使用 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/

相关文章:

c++ - 如何使用虚表正确调用成员方法?

c# - 将 C dll 和方法导入到 c# 中

pointers - 检查基础类型是否是具有反射的结构

go - 如何使用Golang进入FTP的被动模式?

c - C 中的堆栈。存储 pop ant top 结果

c - const 指针和整数 const 指针有什么区别?

go - 使用 x509.MarshalPKCS1PublicKey 从 go 生成 RSA 公钥

json - 如何在 Go 运行时创建 "duck-typed"grpc protobuf 消息?

c++ - 关于Basic C++ Reserving Structs的查询

通过引用传递结构时 C# 框或副本?