我試圖了解互斥鎖是如何工作的。從我目前的理解來看,它是用來承載原子操作和同步訪問一些數據的。我在這里構建了一個隊列數據結構的例子: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++
}
- 3 回答
- 0 關注
- 206 瀏覽
添加回答
舉報
0/150
提交
取消