🐕

goでただ並列実行をしたいだけの時のコード

2025/03/07に公開1
func main() {

	var wg sync.WaitGroup

	queries := []string{
		"SELECT name FROM users WHERE id = 1",
		"SELECT name FROM users WHERE id = 2",
		"SELECT name FROM users WHERE id = 3",
	}

	for _, query := range queries {
		wg.Add(1)
		go fetchData(query, &wg)
	}

	wg.Wait()
	fmt.Println("All queries are fetched")
}

func fetchData(query string, wg *sync.WaitGroup) {
	defer wg.Done()
	// ここに並列実行したい処理を書く
	fmt.Println(query)
}

各タスクに次の工程がある場合はチャネルで待ってもよいが、特に次がない場合はWaitGroupで十分。

実行数が膨れ上がる可能性がある場合はチャネルを使って上限を管理するとよい。

Discussion

tenkohtenkoh

こんにちは!
fetchDataの引数にWaitGroupを持たせると用途が限定されてくるので、呼び出しで無名関数を使うのも手ですね。

for _, query := range queries {
    wg.Add(1)
    go func() {
        defer wg.Done()
        fetchData(query)
    }()
}