第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

函數按值返回鎖

函數按值返回鎖

Go
偶然的你 2022-01-10 16:36:45
我有以下結構    type Groups struct {        sync.Mutex        Names []string    }和以下功能    func NewGroups(names ...string) (Groups, error) {        // ...        return groups, nil    }當我檢查語義錯誤時go vet,我收到以下警告:NewGroups 按值返回 Lock:組像go vet喊叫一樣,不好。這段代碼會帶來什么問題?我怎樣才能解決這個問題?
查看完整描述

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作為值??紤]一下您在特定情況下要完成的工作。


查看完整回答
反對 回復 2022-01-10
?
交互式愛情

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


查看完整回答
反對 回復 2022-01-10
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號