分かっていたつもりなのにまたやってしまったので、自戒を込めて書いておきます。 forループ内でgoroutineを使う場合の注意点 for内でgoroutineを実行する際にやりがちなミスがあります。 以下のコードを見てください。 package main import ( "fmt" "time" ) func main() { values := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} for _, val := range values { go func() { fmt.Println(val) }() } // goroutineが終了するまで待つ。 // コード簡素化のためにsleepしているだけだが、 // 本来はsync.WaitGroupとかchannel使うなど適切な処理をすべき。 time.Sleep(1 * time.Second)