【Go言語】ゴルーチンが実行されずプログラムが終了する

タイトルの通りです。初めてゴルーチンを勉強したときにハマっけど以外に回答を見つけられなかったのでメモします。

ある日、以下のようなコードを書いたときにsub関数の中が全く実行されずに困っていました。 実際にはこんな簡単ではなく少し複雑なコードだったので原因が分からずに困っていました。

package main

import (
    "fmt"
    "time"
)

func sub() {
    fmt.Println("sub done")
}

func main() {
    go sub()
    fmt.Println("main done")
}

// 実行時の出力
// main done

これはsubの中が実行されていくより先にmain関数が終了してしまうためです。 main関数が終了するとプログラムは終了してしまうので、subの中身が実行される前にプログラムが終了してしまいます。結果「sub done」が出力されません。

そのため、以下のようにsubが実行されるようにmainを遅延してあげる必要があります。

package main

import (
  "fmt"
  "time"
)

func sub() {
  fmt.Println("sub done")
}

func main() {
  go sub()
  fmt.Println("main done")
  time.Sleep(1 * time.Second)
}

// 実行時の出力
// main done
// sub done