【高级数据类型】- 6.通道的更多种类

Go语言-通道的更多种类

    咱们在上一节所说的通道,实际上只是Go语言中的通道的一种。它被称为带缓冲的通道,或简称为缓冲通道。
  
    通道有带缓冲和非缓冲之分。咱们已经说过,缓冲通道中能够缓存N个数据。咱们在初始化一个通道值的时候必须指定这个N。相对的,非缓冲通道不会缓存任何数据。发送方在向通道值发送数据的时候会当即被阻塞,直到有某一个接收方已从该通道值中接收了这条数据。非缓冲的通道值的初始化方法以下:缓存

make(chan int, 0)

    注意,在这里,给予make函数的第二个参数值是0
  
    除了上述分类方法,咱们还能够以数据在通道中的传输方向为依据来划分通道。默认状况下,通道都是双向的,即双向通道。若是数据只能在通道中单向传输,那么该通道就被称做单向通道。咱们在初始化一个通道值的时候不能指定它为单向。可是,在编写类型声明的时候,咱们倒是能够这样作的。例如:函数

type Receiver <-chan int

    类型Receiver表明了一个只可从中接收数据的单向通道类型。这样的通道也被称为接收通道。在关键字chan左边的接收操做符<-形象地表示出了数据的流向。相对应的,若是咱们想声明一个发送通道类型,那么应该这样:spa

type Sender chan<- int

    此次<-被放在了chan的右边,而且“箭头”直指“通道”。想必不用多说你也能明白了。咱们能够把一个双向通道值赋予上述类型的变量,就像这样:设计

var myChannel = make(chan int, 3)
var sender Sender = myChannel
var receiver Receiver = myChannel

    可是,反之则是不行的。像下面这样的代码是通不过编译的:code

var myChannel1 chan int = sender

    单向通道的主要做用是约束程序对通道值的使用方式。好比,咱们调用一个函数时给予它一个发送通道做为参数,以此来约束它只能向该通道发送数据。又好比,一个函数将一个接收通道做为结果返回,以此来约束调用该函数的代码只能从这个通道中接收数据。这属于API设计的范畴。所以咱们在这里仅了解一下便可。编译

相关文章
相关标签/搜索