非缓冲通道:
make(chan T)
一次发送 一次接收 都是阻塞的
缓冲通道:
make(chan T, capacity)
发送:缓冲区数据满了才阻塞
接收:缓冲区数据空了才接收
举个例子:
package mainimport (
"fmt"
"strconv"
)func main() {
//非缓冲通道
ch1 := make(chan int)
fmt.Println(len(ch1), cap(ch1)) //0 0//缓存通道
ch2 := make(chan int, 5)
ch2 <- 100
ch2 <- 200
ch2 <- 300
ch2 <- 400
ch2 <- 500
fmt.Println(len(ch2), cap(ch2))
fmt.Println("=======================")
ch3 := make(chan string, 4)
//启动一个子协程 放进去ch3
go sendData(ch3)
for {
v, ok := <-ch3
if !ok {
fmt.Println("Reading completed ")
break
}
fmt.Println("\tthe data read is : ", v)
}
fmt.Println("main-goroutine is finished")
}func sendData(ch chan string) {
for i := 0;
i < 10;
i++ {
ch <- "Data " + strconv.Itoa(i)
fmt.Println("子协程写入第 %d 个数据", i)
}
close(ch)
}
运行结果是:
0 0
5 5
=======================
子协程写入第 %d 个数据 0
子协程写入第 %d 个数据 1
子协程写入第 %d 个数据 2
子协程写入第 %d 个数据 3
子协程写入第 %d 个数据 4
the data read is :Data 0
the data read is :Data 1
the data read is :Data 2
the data read is :Data 3
the data read is :Data 4
the data read is :Data 5
子协程写入第 %d 个数据 5
子协程写入第 %d 个数据 6
子协程写入第 %d 个数据 7
子协程写入第 %d 个数据 8
子协程写入第 %d 个数据 9
the data read is :Data 6
the data read is :Data 7
the data read is :Data 8
the data read is :Data 9
Reading completed
main-goroutine is finished
其实就是缓冲区大小我们设为4导致的。
【Go 缓冲通道(bufchan)用法】参考:bilibili