goroutine執行在相同的位址空間,因此訪問共享記憶體必須 做好同步。goroutine奉行通過通訊來共享記憶體,而不是共享記憶體通訊
它跟map一樣,使用make來建立,它是乙個引用 ,而不是值傳遞
make(chan type, capacity)
channel <- value //傳送value到channel
<- channel //接收並將其丟棄
x := <-channel //從channel中接收資料,並賦值給x
x, ok := <-channel //功能同上,同時檢查通道是否已關閉或者是否為空
package mainimport (
"fmt"//
"time"
)var ch = make(chan int
)func printer(s
string
) }
//person1執行完成後才能到person2執行
func person1()
func person2()
func main()
}
先看執行的結果
helloworld
如何實現的?
首先需要知道的是person1和person2的子協程幾乎是同時執行的,但是,因為person2在列印之前有乙個管道的處理,而與幾乎同時,person1已經在執行print語句了,執行完print語句後又向管道存了值
person2中的管道語句一看管道來值了,也就繼續執行了後面的print語句,這樣才實現了上面的結果
Go channel實現原始碼分析
go通道基於go的併發排程實現,本身並不複雜,go併發排程請看我的這篇文章 go併發排程原理學習 1.channel資料結構 type hchan struct type waitq struct 2.建立channel實現 建立channel例項 ch make chan int,4 實現函式 f...
go channel的學習總結
channel是goland中一種特殊的型別的存在,對於goland的學習來說是非常重要的。channel是goland中goroutine間的通訊的一種方式,可以模擬成 unix 中的程序的通訊方式管道。因為goland是乙個支援併發的程式語言,而且channel又在併發中起了關鍵作用,所以我們簡...
3種優雅的Go channel用法
寫go的人應該都聽過rob pike的這句話 do not communicate by sharing memory instead,share memory by communicating.相信很多朋友和我一樣,在實際應用中總感覺不到好處,為了用channel而用。但以我的切身體會來說,這是寫...