1. 程式人生 > >使用空 struct 做為 channel 中的通知載體

使用空 struct 做為 channel 中的通知載體

背景

使用 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{}
}