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包含您想要的地址。您正在打印包含地址的变量的地址。
TA贡献1847条经验 获得超11个赞
好吧,如果您注意到,“返回”打印语句和“goroutine”打印语句给出了相同的地址。您的“主要”印刷品已关闭。看一行:
fmt.Printf(" main %p\n", &wg)
你注意到什么?您正在打印&wg
,wg
分配给的任何地址。
现在看看你的Run()
函数的返回值,你正在返回&wg
. 指向您wg
作为变量的第一个声明的指针。
所以基本上你的“主要”打印是打印wg
指针地址的地址而不是指针地址本身......希望这是有道理的......
但是,是的,将“main”中的行更改为
fmt.Printf(" main %p\n", wg)
- 2 回答
- 0 关注
- 225 浏览
添加回答
举报