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")
}

 

posted @ 2020-08-23 21:07  Single_Dont  阅读(413)  评论(0编辑  收藏  举报