什么是单向通道
channel
本身支持读写操作,单向通道顾名思义是指一个通道只能读或者只能写
注意:
如果一个通道只能读或者只能写将毫无意义。所以单向channel
的概念只是对channel
的一种使用限制
单向通道的声明格式
关键点:
<
指向哪儿数据往哪儿流
var 通道实例 chan<- 元素类型 // 只能写入(箭头指向通道意思是只能流入通道)
var 通道实例 <-chan 元素类型 // 只能读取(箭头指出通道意思是只能流出通道)
-
元素类型:通道包含的元素类型。
-
通道实例:声明的通道变量。
单通道使用例子
package main
func main() {
// 声明一个通道
ch := make(chan int)
// 声明一个单向通道变量--->这里面不是很理解后面的赋值是什么意思,将ch赋值给chSendOnly在实际调用变量的时候用的还是chSendOnly
var chSendOnly <-chan int = ch
// 声明单项只接收通道
var cnRecvOnly chan<- int = ch
}
time包中的单向通道
timer
的Timer
类型:
type Timer struct {
C <-chan Time
/*
C通道的类型就是一种只能读取的单向通道。如果此处不进行通道方向约束,一旦外部向通道写入数据,将会造成其他使用到计时器的地方逻辑产生混乱。
*/
r runtimeTimer
}
timer
包中的计时器返回timer
实例:
timer := time.NewTimer(time.Second)
优点:
单向通道有利于代码接口的严谨性
关闭channel
-
如何关闭
channel
-
如何判断
channel
已经被关闭
如何关闭channel
调用go
包下的close()
函数:
close(ch)
如何判断channel
已经被关闭
x, ok := <-ch
观察ok
变量返回的布尔量即可