不帶緩衝的通道
這種類型的通道要求發送 goroutine 和接收 goroutine 同時準備好,才能完成發送和接收操作。
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int, 0)
go func() {
defer func() {
fmt.Println("recycle")
}()
a := <- c
fmt.Println("read",a)
}()
c <- 11
fmt.Println("write")
time.Sleep(time.Second*5)
}
輸出:
read 11
recycle
write
可以看出發送端會一直阻塞到這個goroutine完全退出。
帶緩衝的通道
上面代碼第10行,改成緩衝爲1個的通道
c := make(chan int, 1)
輸出:
write
read 11
recycle
就變成了:我先走了,你們慢慢退出。