我试图了解互斥锁是如何工作的。从我目前的理解来看,它是用来承载原子操作和同步访问一些数据的。我在这里构建了一个队列数据结构的例子: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 关注
- 188 浏览
添加回答
举报
0/150
提交
取消