为了账号安全,请及时绑定邮箱和手机立即绑定

在 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 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信