golang在多個go routine中進行map或者slice操作應該注意的對象。

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

因為golang的map和列表切片都是參考型別,且非安全執行緒的,所以在多個go routine中進行讀寫操作的時候,會產生“map read and map write“的panic錯誤。

 

某一些類型的對象,會有這種類似的set方法來寫資料,或者get方法來返回一個map:

func (this *object) Set(name, val) {  this.Lock()  defer this.Unlock()    this.m[name] = val}func (this *object) Get() map[string]string {  this.Lock()  defer this.Unlock()  return this.m}

  

如果會在多個go routine中通過該對象的Get()方法擷取到的map進行讀操作,並且在其他go routine中用Set()方法來寫操作,那麼有可能會導致“map read and map write“的panic錯誤。

原因是Get方法擷取的map和Set方法操作的map是同一個map,如果讀寫線程在同一時刻操作這2個map,就會產生錯誤。

所以Get方法最好用這種方式返回map:

func (this *object) Get() map[string]string {    this.Lock()    defer this.Unlock()    newm := make(map[string]string)    for k, v := range this.m {        newm[k] = v    }    return newm}

 

這樣每次Get擷取的map,其實是一個新的map,就可以不用考慮同時讀寫的問題了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.