15 golang併發中channel的使用

2021-08-31 03:23:30 字數 922 閱讀 3956

我們先寫一段**

func main() 

}func printer(str string)

fmt.println()

}func person1()

func person2()

這段**很簡單,就是模擬兩個人使用1個印表機

那麼現在是併發狀態使用印表機

結果我們會發現

出現了whoerlllod這樣併發列印的效果

然後我們需要想乙個辦法

使得我們的person1和person2有乙個同步的狀態

就是person1列印完成了再列印person2

這時候我們就需要使用到channel了

我們要定義乙個成員變數

var channel = make(chan int)

func main()

}func printer(str string)

fmt.println()

}func person1()

func person2()

這裡的<-channel意思是

在channel收到資料之前,這裡就是阻塞的

channel<- 1實際上就是發了乙個1這個資訊

這樣person2中就收到了乙個1

那麼這裡的子協程就不阻塞了,就可以進行列印了

所以channel就是通過傳遞資訊這樣的方式

來實現同步

當然資料也可以支援其他的格式

比如string

var channel = make(chan string)

func main()

}func printer(str string)

fmt.println()

}func person1()

func person2()

golang中chan型別的位址

chan型別本是就是指標,因此直接列印即可,不需要再取位址.如果在取位址就是 指向指標的指標 pointer to pointer 即類似c c 中的二級指標 如 int a int p a int pp p 其中pp就是二級指標 package main import fmt func main ...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...