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轉換爲一個接收通道類型(此時「<-」是類型的一部分)

相關文章
相關標籤/搜索