go:channel(未完)

:1)如下的全部讨论创建在包含整形元素的通道类型之上,即 chan int缓存

  2)对于“<-”个人理解是,它多是一个操做符(接收操做符),也spa

     多是类型的一部分(如“chan<- int”表示包含整形元素的发送通道类型blog

 

带缓冲和不带缓存的channel
循环

1.带缓冲:ch:=make(chan int,1)遍历

  1)goruntine A 中包含语句 ch<-1:表示向ch发送1,若此时ch中已经有一个数据,则A阻塞在此处,直到ch中的数据被取走;channel

  2)goruntine A 中包含语句  <-ch:表示从ch中接收一个数据,若此时ch中无数据,则A阻塞在此处,直到有数据传入ch;  im

  3)假设ch:=make(chan int,100),for i := range ch {...}经过range 在遍历 ch 的时候须要注意:数据

      a. range循环接收ch,直到close(ch),若是没有数据,将阻塞在此处。
      b. 当close(ch)运行后,不可向ch发送数据,但仍然能够接收ch剩余数据,直到ch中数据为空,这时range语句将结束而非阻塞。
  

2.不带缓冲:ch:=make(chan int),此时的ch只做数据传递的做用,不能存储数据(由于它没buffer)。img

  1)goruntine A 包含 ch<-1:运行到此处A当即阻塞,除非另外一个goruntine B 正在执行 ch<-类型转换

    换个说法:A欲向ch发送数据,仅当B作好了从ch接收数据的准备;

  2)同理,goruntine A 包含 <-ch。A欲从ch接收一个数据,仅当B作好了向ch发送数据的准备。

  

类型转换:必定注意chan int是一个总体

     <-chan int(v):将v转换为一个通道类型,再从该通道接收一个值(此时“<-”是一个操做符)

  (<-chan int)(v):将v转换为一个接收通道类型(此时“<-”是类型的一部分)

相关文章
相关标签/搜索