go语言——channel特点
知识点
通道拥有阻塞机制(无缓冲区),有缓冲区同理。
接收端在发送端数据发送完成之前(通道为nil),处于阻塞状态
发送端在接收端数据拿走完成之前(通道为满),处于阻塞态
注意点
1.struct{}类型不占空间,作为通道的一种信号方式
2.chan类型为引用类型,故需要进行初始化,申请空间,在通道使用结束后Close()关闭
3.nil状态不可以进行数据通信
4.避免在接收端关闭通道,因为不知道发送端是否再发数据,尽量发送端关闭,接收端判断。
5.形参为单通道类型,实参为双通道类型会默认根据形参类型进行自动转换;不能利用函数声明把单向通道转换成双向通道
6.单通道类型:<-ch :表示只读通道;ch<-:表示只写通道
使用实例
1.利用通道发送一个空结构类型(struct{})实现goroutine的同步机制
var ch chan struct{} func test() { fmt.Println("test begin ,waitting 1 second...") time.Sleep(time.Second) fmt.Println("test end") ch <- struct{}{} } func main() { ch = make(chan struct{}, 1) fmt.Println("main begin") go test() <-ch fmt.Println("main end") }