使用空 struct 做為 channel 中的通知載體
阿新 • • 發佈:2018-12-30
背景
使用 Golang 開發的時候,會經常使用 channel
來進行訊號通知,即所傳遞的資料本身沒有什麼實際價值。
實現方式
之前一直使用如下方式
ch := make(chan int)
後來看到另外一種方式
ch := make(chan struct{})
兩種方式的對比
使用空 struct
是對記憶體更友好的開發方式,在 go
原始碼中針對 空struct
類資料記憶體申請部分,返回地址都是一個固定的地址。那麼就避免了可能的記憶體濫用。
runtime/malloc.go :581
func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
...
if size == 0 {
return unsafe.Pointer(&zerobase)
}
...
// zerobase 是一個本 package 的區域性變數
}
注意
這裡需要注意的地方就是,不要將 size
為 0 和 zero-value
混淆。
zero-value
的解釋如下
Variables declared without an explicit initial value are given their zero value.
預設值
與 佔用記憶體空間為 0
不是一個概念 ,示例如下
func main() {
array := [0 ]int{}
var a string
fmt.Printf("%d\n", unsafe.Sizeof(array))
fmt.Printf("%d\n", unsafe.Sizeof(a))
}
OutPut:
0
16
想法
以後程式碼這麼寫,應該會好一些。
type notify struct{}
func main() {
ch := make(chan notify)
ch <- notify{}
}