缓冲通道
缓冲通道就是指一个通道带有一个缓冲区,发送数据到一个缓冲通道只有在缓冲区满时才被阻塞,从缓冲通道获取数据只有在缓冲区为空时才会被阻塞。
通道可以存放的数据个数为1+缓冲区容量
代码实现:
package main
import (
"fmt"
"strconv"
)
func main(){
ch := make(chan string, 4) //缓冲区容量为4
go sendData(ch)
for v := range ch{
fmt.Println("读取的数据:",v)
}
fmt.Println("main..over..")
}
func sendData(ch chan string){
for i:=0;i<10;i++{
ch <- "数据" + strconv.Itoa(i)
fmt.Printf("子goroutine中写入第 %d 个数据\n",i)
}
close(ch)
}
控制台输出(结果不唯一):
子goroutine中写入第 0 个数据
子goroutine中写入第 1 个数据
读取的数据: 数据0
读取的数据: 数据1
读取的数据: 数据2 //注意理解此处的误差
子goroutine中写入第 2 个数据
子goroutine中写入第 3 个数据
子goroutine中写入第 4 个数据
子goroutine中写入第 5 个数据
子goroutine中写入第 6 个数据
子goroutine中写入第 7 个数据
读取的数据: 数据3
读取的数据: 数据4
读取的数据: 数据5
读取的数据: 数据6
读取的数据: 数据7
子goroutine中写入第 8 个数据
子goroutine中写入第 9 个数据
读取的数据: 数据8
读取的数据: 数据9
main..over..
单向通道
前面学习的通道都是双向的,即既可以从一个方向都,也可以从同一个方向写,而单向通道,即是只能读,或者写的通道
单向通道有什么用呢?
我们往往只会创建普通的通道,
而单向通道往往用来作为函数的形参保证函数对其只读或者只写