底層數據實現
type hchan struct {
? ? qcount ? uint ? ? ? ? ? // 當前隊列中的元素數量
? ? dataqsiz uint ? ? ? ? ? // 環形隊列的大小
? ? buf ? ? ?unsafe.Pointer // 指向環形隊列的指針
? ? elemsize uint16 ? ? ? ? // 元素大小
? ? closed ? uint32 ? ? ? ? // channel 是否關閉
? ? elemtype *_type ? ? ? ? // 元素類型
? ? sendx ? ?uint ? ? ? ? ? // 發送索引
? ? recvx ? ?uint ? ? ? ? ? // 接收索引
? ? recvq ? ?waitq ? ? ? ? ?// 接收等待隊列
? ? sendq ? ?waitq ? ? ? ? ?// 發送等待隊列
? ? lock ? ? mutex ? ? ? ? ?// 互斥鎖
}
buf
是有緩沖的channel所特有的結構,用來存儲緩存數據。是個循環鏈表sendx
和recvx
用于記錄buf
這個循環鏈表中的發送或者接收的indexrecvq
和sendq
分別是接收(<-channel)或者發送(channel <- xxx)的goroutine抽象出來的結構體(sudog)的隊列。是個雙向鏈表- ? lock 互斥鎖在進行獲取或者接收時都會進行加鎖操作
channel的使用
創建channel實際上就是在內存中實例化了一個hchan
的結構體,并返回一個ch指針
當channel緩存滿了,或者沒有緩存的時候,我們繼續send(ch <- xxx)或者recv(<- ch)會阻塞當前goroutine
|