🖥

Go言語 | goroutineの基本 ( Go by Example より )

2023/08/26に公開

Go by Example: Goroutines に以下のサンプルがある。

package main

import "fmt"

func f(from string) {
	for i := 0; i < 3; i++ {
		fmt.Println(from, ":", i)
	}
}

func main() {
	f("direct")

	go f("goroutine")

	go func(msg string) {
		fmt.Println(msg)
	}("going")

	var input string
	fmt.Scanln(&input)
	fmt.Println("done")
}

解説

普通に出力を行う部分

これは必ず実行される。

f("direct")

非同期でループ実行される部分。

go f("goroutine")

非同期で1回だけ実行される部分。

go func(msg string) {
	fmt.Println(msg)
}("going")

ユーザー入力を待つ部分

これがないと、プログラムが非同期処理より早く終わってしまって、結果が出力されない。

var input string
fmt.Scanln(&input)
fmt.Println("done")

要するに非同期処理が終わるまで待てば良いので、Sleep とかでも同じことが出来るようだ。

time.Sleep(100000)
fmt.Println("done")

実行結果

goroutine : 0
goroutine : 1
goroutine : 2
going

いまいち非同期処理されていることが分かりづらい。

ループ回数を増やしてみよう

- for i := 0; i < 3; i++ {
+ for i := 0; i < 30; i++ {

結果

非同期処理されているのが分かりやすくなった。
(コマンドを走らせるたびに going の位置が変わることに気付くだろう)

..
goroutine : 3
goroutine : 4
goroutine : 5
going
goroutine : 6
goroutine : 7
goroutine : 8
..

環境

  • go version go1.8.1 darwin/amd64

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2017-04-29

Discussion