初心者の自分が最初に「ん??」となったchannelを自分自身理解するために順を追って書いていく
全てのソースコードにはこちらが読み込まれているとする
package main
import (
"fmt"
)
index
- 最小のchannel
- task関数に切り出す
func main() {
ch := make(chan int) // channelをバッファなしで作成
go func(){ ch <- 1}() // ゴルーチンで即時に実行 チャネルに送信
fmt.Println(<-ch) // チャネルが受信
}
func task(c chan int) { // それぞれ task(パラメータ 型 チャネルが送信する型)
c <- 1
}
func main() {
ch := make(chan int)
go task(ch)
fmt.Println(<-ch)
}
func task(v string, c chan int) { // stringを受け取るようにする
fmt.Println(v)
c <- 1
}
func task2(v string, c chan int) {
fmt.Println(v)
c <- 2
}
func main() {
ch := make(chan int)
ch2 := make(chan int)
go task2("task2", ch2)
go task("task", ch)
fmt.Println(<-ch)
fmt.Println(<-ch2)
}
package main
import (
"fmt"
"sync"
)
func task(v string, wg *sync.WaitGroup) { // 実態型
fmt.Println(v)
wg.Done()
}
func task2(v string, wg *sync.WaitGroup) {
fmt.Println(v)
wg.Done()
}
func main() {
var wg sync.WaitGroup // goroutineが終わる前に処理が終わってしまうのを防ぐためにsync.WaitGroup
wg.Add(2) // 2つの並列処理があることを伝える
go task("task1", &wg) // ポインタを渡す
go task2("task2", &wg)
wg.Wait() // 2つのDoneを待つ
}