为什么这个 golang 代码段中指向 WaitGroup 的指针地址不同?

我正在打印指针地址sync.WaitGroup,它们都不同。为什么?


func Run() *sync.WaitGroup {

    var wg sync.WaitGroup

    wg.Add(1)

    go func() {

        defer wg.Done()

        fmt.Printf("goroutine %p\n", &wg)


        time.Sleep(5 * time.Second)

        fmt.Println("wokeup")

    }()


    fmt.Printf("returning %p\n", &wg)

    return &wg

}


func main() {

    runtime.GOMAXPROCS(3)

    wg := Run()


    fmt.Printf("     main %p\n", &wg)

    wg.Wait()

}

典型的输出显示函数内部的地址Run与main. 我希望那是一样的,n'est-ce pas ?


returning 0xc0840045c0

     main 0xc084000038

goroutine 0xc0840045c0

wokeup


茅侃侃
浏览 228回答 2
2回答

函数式编程

例如,package mainimport "fmt"import "sync"import "time"import "runtime"func Run() *sync.WaitGroup {    var wg sync.WaitGroup    wg.Add(1)    go func() {        defer wg.Done()        fmt.Printf("goroutine %p\n", &wg)        fmt.Println("sleep for 5s")        time.Sleep(5 * time.Second)        fmt.Println("wokeup")    }()    fmt.Printf("returning %p\n", &wg)    return &wg}func main() {    runtime.GOMAXPROCS(3)    wg := Run()    fmt.Printf("     main %p\n", wg)    wg.Wait()}输出:returning 0x1052e2c0     main 0x1052e2c0goroutine 0x1052e2c0sleep for 5s改变fmt.Printf("     main %p\n", &wg)到fmt.Printf("     main %p\n", wg)在 中main,变量wg包含您想要的地址。您正在打印包含地址的变量的地址。

回首忆惘然

好吧,如果您注意到,“返回”打印语句和“goroutine”打印语句给出了相同的地址。您的“主要”印刷品已关闭。看一行:fmt.Printf("     main %p\n", &wg)你注意到什么?您正在打印&wg,wg分配给的任何地址。现在看看你的Run()函数的返回值,你正在返回&wg. 指向您wg作为变量的第一个声明的指针。所以基本上你的“主要”打印是打印wg指针地址的地址而不是指针地址本身......希望这是有道理的......但是,是的,将“main”中的行更改为fmt.Printf("     main %p\n", wg)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go