diff --git a/goroutine/README.md b/goroutine/README.md index c0eafde..69ae3c8 100644 --- a/goroutine/README.md +++ b/goroutine/README.md @@ -1,3 +1,5 @@ ## MEMO - 最初に呼び出されるgoroutineはmain goroutine +- `make(chan string)` でバッファなし、 `make(chan string, 10)`のように書けばバッファあり + バッファがいっぱい場合は受信されて空きができるまで待たされる。 diff --git a/goroutine/parallel.go b/goroutine/parallel.go new file mode 100644 index 0000000..2772aff --- /dev/null +++ b/goroutine/parallel.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" +) + +func main() { + ng() // 2, 2, 2 + ok() // 0, 1, 2 +} + +func ng() { + ary := [3]int{1, 2, 3} + done := make(chan bool) + for i := range ary { + go func() { + fmt.Println(i) // NG + done <- true + }() + } + for i := 0; i < 3; i++ { + <- done + } +} + +func ok() { + ary := [3]int{1, 2, 3} + done := make(chan bool) + for i := range ary { + go func(i int) { + fmt.Println(i) + done <- true + }(i) + } + for i := 0; i < 3; i++ { + <- done + } +}