【高级数据类型】- 5.通道类型

Go语言-通道类型

    通道(Channel)是Go语言中一种很是独特的数据结构。它可用于在不一样Goroutine之间传递类型化的数据,而且是并发安全的。相比之下,咱们以前介绍的那些数据类型都不是并发安全的。这一点须要特别注意。
  
    Goroutine(也称为Go程序)能够被看作是承载可被并发执行的代码块的载体。它们由Go语言的运行时系统调度,并依托操做系统线程(又称内核线程)来并发地执行其中的代码块。至于怎样编写这样的代码块以及怎样驱动这样的代码块执行,咱们先按下不表。
  
    通道类型的表示方法很简单,仅由两部分组成,以下:缓存

chan T

    在这个类型字面量中,左边是表明通道类型的关键字chan,而右边则是一个可变的部分,即表明该通道类型容许传递的数据的类型(或称通道的元素类型)。这两部分之间须要以空格分隔。
  
    与其它的数据类型不一样,咱们没法表示一个通道类型的值。所以,咱们也没法用字面量来为通道类型的变量赋值。咱们只能经过调用内建函数make来达到目的。make函数可接受两个参数。第一个参数是表明了将被初始化的值的类型的字面量(好比chan int),而第二个参数则是值的长度。例如,若咱们想要初始化一个长度为5且元素类型为int的通道值,则须要这样写:安全

make(chan int, 5)

    顺便说一句,实际上make函数也能够被用来初始化切片类型或字典类型的值。数据结构


    确切地说,通道值的长度应该被称为其缓存的尺寸。换句话说,它表明着通道值中能够暂存的数据的个数。注意,暂存在通道值中的数据是先进先出的,即:越早被放入(或称发送)到通道值的数据会越先被取出(或称接收)。
    
    下面,咱们声明一个通道类型的变量,并为其赋值:并发

ch1 := make(chan string, 5)

    这样一来,咱们就可使用接收操做符<-向通道值发送数据了。固然,也可使用它从通道值接收数据。例如,若是咱们要向通道ch1发送字符串"value1",那么应该这样作:函数

ch1 <- "value1"

    另外一方面,咱们若想从ch1那里接收字符串,则要这样:spa

<- ch1

    这时,咱们能够直接把接收到的字符串赋给一个变量,如:操作系统

value := <- ch1

    与针对字典值的索引表达式同样,针对通道值的接收操做也能够有第二个结果值。请看下面的示例:线程

value, ok := <- ch1


    这样作的目的一样是为了消除与零值有关的歧义。这里的变量ok的值一样是bool类型的。它表明了通道值的状态,true表明通道值有效,而false则表明通道值已无效(或称已关闭)。更深层次的缘由是,若是在接收操做进行以前或过程当中通道值被关闭了,则接收操做会当即结束并返回一个该通道值的元素类型的零值。按照上面的第一种写法,咱们无从判断接收到零值的缘由是什么。不过,有了第二个结果值以后,这种判断就好作了。
   
    说到关闭通道值,咱们能够经过调用内建函数close来达到目的,就像这样:code

close(ch1)

    请注意,对通道值的重复关闭会引起运行时恐慌。这会使程序崩溃。因此必定要避免这种状况的发生。另外,在通道值有效的前提下,针对它的发送操做会在通道值已满(其中缓存的数据的个数已等于它的长度)时被阻塞。而向一个已被关闭的通道值发送数据会引起运行时恐慌。另外一方面,针对有效通道值的接收操做会在它已空(其中没有缓存任何数据)时被阻塞。除此以外,还有几条与通道的发送和接收操做有关的规则。不过在这里咱们记住上面这三条就能够了。
  
  最后,与切片和字典类型相同,通道类型属于引用类型。它的零值即为nil索引

相关文章
相关标签/搜索