キーワードの背後にある式go
が評価され、その式の関数値が同時に実行されます。
したがって、あなたの例oneFunc()
では呼び出されるため、oneFunc
出力とanotherFunc
、返されたインスタンスのメソッドが同時に呼び出されます。ただし、ゴルーチンが実行される前にプログラムが終了するため、表示されません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
スタック トレースは、2 つの関数が異なるゴルーチンで実行されていることも示しており、メソッド呼び出しの比較は必要ありません。