亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在 Go 中使用互斥鎖

在 Go 中使用互斥鎖

Go
一只斗牛犬 2021-09-13 14:54:43
我試圖了解互斥鎖是如何工作的。從我目前的理解來看,它是用來承載原子操作和同步訪問一些數據的。我在這里構建了一個隊列數據結構的例子:https : //github.com/arnauddri/algorithms/blob/master/data-structures%2Fqueue%2Fqueue.go下面是一些代碼:package queueimport "sync"type Queue struct {    queue []interface{}    len   int    lock  *sync.Mutex}func New() *Queue {    queue := &Queue{}    queue.queue = make([]interface{}, 0)    queue.len = 0    return queue}func (q *Queue) Push(el interface{}) {    q.lock.Lock()    defer q.lock.Unlock()    q.queue = append(q.queue, el)    q.len++}但是,當我嘗試創建隊列并將項目推送到該隊列時,出現運行時錯誤:q := New()q.Push(1)panic: runtime error: invalid memory address or nil pointer dereference [recovered]panic: runtime error: invalid memory address or nil pointer dereference我真的不明白這里發生了什么。我應該如何在這里使用互斥鎖?
查看完整描述

3 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

指針的零值是 nil,q.lock 是 nil 指針,取消引用 nil 指針會導致 panic。您可以使用lock sync.Mutex而不是*lock sync.Mutex,Mutex 的零值是未鎖定的互斥鎖。 結構匿名嵌套也可以解決你的問題:


package queue


import "sync"


type Queue struct {

    queue []interface{}

    len   int

    sync.Mutex

}


func New() *Queue {

    queue := &Queue{}

    queue.queue = make([]interface{}, 0)

    queue.len = 0


    return queue

}


func (q *Queue) Push(el interface{}) {

    q.Lock()

    defer q.Unlock()


    q.queue = append(q.queue, el)

    q.len++

}


查看完整回答
反對 回復 2021-09-13
  • 3 回答
  • 0 關注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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