在 Go 中使用互斥锁

我试图了解互斥锁是如何工作的。从我目前的理解来看,它是用来承载原子操作和同步访问一些数据的。


我在这里构建了一个队列数据结构的例子:https : //github.com/arnauddri/algorithms/blob/master/data-structures%2Fqueue%2Fqueue.go


下面是一些代码:


package queue


import "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

我真的不明白这里发生了什么。


我应该如何在这里使用互斥锁?


一只斗牛犬
浏览 191回答 3
3回答

慕哥9229398

指针的零值是 nil,q.lock 是 nil 指针,取消引用 nil 指针会导致 panic。您可以使用lock sync.Mutex而不是*lock sync.Mutex,Mutex 的零值是未锁定的互斥锁。 结构匿名嵌套也可以解决你的问题:package queueimport "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++}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go