以下由golang教學專欄跟大家介紹關於Golang channel的實現,希望對需要的朋友有幫助!
channel是Go語言在語言層級提供的goroutine間的溝通方式,可以使用channel在兩個或多個goroutine之間傳遞訊息。 channel是進程內通訊方式,因此透過channel傳遞物件的過程和呼叫函數時的參數傳遞行為比較一致,例如也可以傳遞指標。如果需要跨進程通信,建議使用分散式系統來解決,例如使用Socket或HTTP等通信協定。
channel是型別相關的,也就是說,一個chennel只能傳遞一個型別的值,這個型別需要在宣告channel時指定。注意,在GO語言中channel本身也是一個原生類型,與map之類的類型地位一樣,因此channel本身在定義後也可以透過channel傳遞。
type hchan struct { qcount uint // 队列中当前数据的个数 dataqsiz uint // size of the circular queue buf unsafe.Pointer // 数据缓冲区,存放数据的环形数组 elemsize uint16 // channel中数据类型的大小(单个元素的大小) closed uint32 // 表示channel是否关闭标识位 elemtype *_type // 队列中的元素类型 sendx uint // 当前发送元素的索引 recvx uint // 当前接收元素的索引 recvq waitq // 接受等待队列,由recv行为(也就是<-ch)阻塞在channel上的goroutine队列 sendq waitq // 发送等待队列, 由send行为(也就是ch<-)阻塞在channel上的goroutine队列 //lock保护chann中的所有字段,以及在此通道上阻塞的sudoG中的几个字段。 //保持此锁时不要更改另一个G状态(特别是没准备好G),因为这可能会因堆栈收缩而死锁 lock mutex } //发送及接收队列的·1结构体 type waitq struct { first *sudog last *sudog }
1.建立帶有buffer的channel
#2.寫入資料
#
#3.3 寫入過程如下:
以上是關於Golang channel的實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!