Goのdeferの挙動について

前提

初めてのGo言語という書籍のサンプルコードを実行しているときに
deferの挙動についてわからないことがありました。

実現したいこと

以下のサンプルコードを実行すると出力パターンが3パターンありました。
1,2はcloseとfmt.Printlnが並列で動いてるため、どちらが先に実行されるかの問題だと思うのですが、
3のパターンがなぜ起こるのかがわかりませんでした。

出力パターン

1

1 2 3 4 5 chをクローズしました

2

1 2 3 4 chをクローズしました 5

3

1 2 3 4 5

該当のソースコード

Go

package main import "fmt" func main() { ch := make(chan int) go func() { defer func() { close(ch) fmt.Println("chをクローズしました") }() for i := 1; i <= 5; i++ { ch <- i } }() for v := range ch { // チャネルchがクローズされるまでループ //liststart fmt.Println(v) } //listend}

補足情報(FW/ツールのバージョンなど)

go version go1.19.2 linux/amd64

コメントを投稿

0 コメント