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

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

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

Go
茅侃侃 2021-07-28 13:47:39
我正在打印指针地址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 0xc084000038goroutine 0xc0840045c0wokeup
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

例如,


package main


import "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 0x1052e2c0

goroutine 0x1052e2c0

sleep for 5s

改变


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


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

在 中main,变量wg包含您想要的地址。您正在打印包含地址的变量的地址。


查看完整回答
反对 回复 2021-08-02
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

好吧,如果您注意到,“返回”打印语句和“goroutine”打印语句给出了相同的地址。您的“主要”印刷品已关闭。看一行:

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

你注意到什么?您正在打印&wgwg分配给的任何地址。

现在看看你的Run()函数的返回值,你正在返回&wg. 指向您wg作为变量的第一个声明的指针。

所以基本上你的“主要”打印是打印wg指针地址的地址而不是指针地址本身......希望这是有道理的......

但是,是的,将“main”中的行更改为

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


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

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