前提
初めての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 コメント