计算关键字后面的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 中运行,无需比较方法调用。