3 回答
TA贡献1850条经验 获得超11个赞
go计算关键字后面的表达式,然后并发执行该表达式的函数值。
因此,在您的示例中oneFunc()被调用,因此oneFunc输出和anotherFunc返回实例上的方法被同时调用。但是,您的程序在 goroutine 可以运行之前终止,这就是为什么您看不到anotherFunc打印的原因。
解决方案:使用sync.WaitGroup或通道进行同步。
实际上(根据经验)验证您的go调用是否anotherFunc并发执行,而不是 oneFunc您可以在每个函数中打印堆栈并比较输出。示例(在玩):
var wg = sync.WaitGroup{}
func main() {
wg.Add(1)
go oneFunc().anotherFunc()
wg.Wait()
}
func oneFunc() something {
fmt.Println("oneFunc")
buf := make([]byte, 4096)
runtime.Stack(buf, false)
fmt.Println("Stack of oneFunc:", string(buf))
return something{}
}
type something struct{}
func (s something) anotherFunc() {
defer wg.Done()
buf := make([]byte, 4096)
runtime.Stack(buf, false)
fmt.Println("Stack of anotherFunc:", string(buf))
fmt.Println("anotherFunc")
}
你会看到这样的事情:
oneFunc
Stack of oneFunc: goroutine 1 [running]:
main.oneFunc()
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:20 +0x118
main.main()
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x50
Stack of anotherFunc: goroutine 2 [running]:
main.something.anotherFunc()
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:32 +0xb2
created by main.main
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x69
anotherFunc
堆栈跟踪甚至会告诉您这两个函数在不同的 goroutine 中运行,不需要比较方法调用。
- 3 回答
- 0 关注
- 212 浏览
添加回答
举报