0
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2017-04-29

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オープンチャットもご利用ください。

Twitter

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3