一尘不染

在Go中使用互斥锁

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

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

我应该如何在这里使用Mutex?

非常感谢


阅读 311

收藏
2020-07-02

共1个答案

一尘不染

看起来问题在于您从未实例化互斥体。运行该New()函数时,您正在创建一个空的Queue,其中包含一个可以引用互斥量的变量,但实际上您从未告诉过它这样做,这意味着在这一点上queue.lock == nil。您可以通过在New()函数中添加实例化行来解决此问题。

queue.lock = new(sync.Mutex)

这是一个有效的游乐场演示:http :
//play.golang.org/p/Qa6buDaHIj

2020-07-02