1 回答
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
Counter.GetMux()不,如果同時(shí)從多個(gè) goroutine 調(diào)用它是不安全的:GetMux()同時(shí)讀取和寫入Counter.mux字段。
一般的方法是使用類似“構(gòu)造函數(shù)”的函數(shù)來處理初始化,如下所示:
func NewCounter() *Counter {
return &Counter{
mux: &sync.Mutex{},
}
}
當(dāng)然,總是用 this 創(chuàng)建計(jì)數(shù)器NewCounter()。
另一種有限的方法是使用非指針互斥值:
type Counter struct {
mux sync.Mutex
counter int
}
因此,當(dāng)您有一個(gè)Counter結(jié)構(gòu)值時(shí),它——按照設(shè)計(jì)——包括一個(gè)互斥體。但是,如果您這樣做,Counter則應(yīng)始終將其用作指針,并且Counter不得復(fù)制結(jié)構(gòu)值(否則互斥鎖字段也將被復(fù)制,但作為包文檔的sync狀態(tài):“包含此包中定義的類型的值不應(yīng)被復(fù)制。”)。
這樣做的明顯優(yōu)勢是零值是Counter一個(gè)有效且準(zhǔn)備好的計(jì)數(shù)器(您應(yīng)該針對您的自定義類型),并且不需要構(gòu)造函數(shù)。
- 1 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報(bào)
