2 回答

TA貢獻1810條經驗 獲得超5個贊
您需要將 sync.Mutex 作為指針嵌入:
type Groups struct {
*sync.Mutex
Names []strng
}
解決您對問題的評論:在文章http://blog.golang.org/go-maps-in-action通知中,Gerrand 沒有從函數返回結構,而是立即使用它,這就是為什么他不是t 使用指針。在您的情況下,您將返回它,因此您需要一個指針,以免復制 Mutex。
更新:正如@JimB 指出的那樣,嵌入指向 的指針可能并不謹慎sync.Mutex,最好返回指向外部結構的指針并繼續(xù)將 嵌入sync.Mutex作為值??紤]一下您在特定情況下要完成的工作。

TA貢獻1712條經驗 獲得超3個贊
*Groups而是返回一個指針。
嵌入互斥指針也可以,但有兩個缺點,需要您格外小心:
結構的零值將有一個 nil 互斥體,因此您必須每次顯式初始化它
func main() {
a, _ := NewGroups()
a.Lock() // panic: nil pointer dereference
}
func NewGroups(names ...string) (Groups, error) {
return Groups{/* whoops, mutex zero val is nil */ Names: names}, nil
}
分配一個結構值,或將其作為函數 arg 傳遞,會創(chuàng)建一個副本,因此您還可以復制互斥指針,然后鎖定所有副本。(在某些特定情況下,這可能是一個合法的用例,但大多數時候它可能不是您想要的。)
func main() {
a, _ := NewGroups()
a.Lock()
lockShared(a)
fmt.Println("done")
}
func NewGroups(names ...string) (Groups, error) {
return Groups{Mutex: &sync.Mutex{}, Names: names}, nil
}
func lockShared(g Groups) {
g.Lock() // whoops, deadlock! the mutex pointer is the same
}
保留原始結構并返回指針。您不必顯式地初始化嵌入式互斥鎖,而且很直觀,互斥鎖不與您的結構副本共享。
func NewGroups(names ...string) (*Groups, error) {
// ...
return &Groups{}, nil
}
游樂場(有失敗的例子):https : //play.golang.org/p/CcdZYcrN4lm
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報