更改地图数据时如何防止死锁

我尝试编写一个验证数据的函数。看下面的代码:


func Create(name, email, password, local string, termOf bool) map[string]string {


    wait := new(sync.WaitGroup)

    mutex := new(sync.Mutex)

    errMsg := make(map[string]string)


    if !termOf {

        mutex.Lock()

        errMsg["termOf"] = translate(local, "text06")

        mutex.Unlock()

    }


    wait.Add(1)

    go func() {

        err := ValidateName(name, local)

        mutex.Lock()

        errMsg["name"] = err.Error()

        mutex.Unlock()

        wait.Done()

    }()


    wait.Add(1)

    go func() {

        err := ValidateEmail(email, local)

        mutex.Lock()

        errMsg["email"] = err.Error()

        mutex.Unlock()

        wait.Done()

    }()


    wait.Add(1)

    go func() {

        err := ValidatePassword(password, local)

        mutex.Lock()

        errMsg["password"] = err.Error()

        mutex.Unlock()

        wait.Done()

    }()


    wait.Wait()


    // If errors appear

    if len(errMsg) > 0 {

        return errMsg

    }


    return nil

}

正如你在这里看到的,我使用了三个 goroutines 并且在 goroutine 中我锁定它以更改 errMsg 变量映射类型。当我运行该函数时,出现编译器错误


runtime error: invalid memory address or nil pointer dereference

[signal 0xc0000005 code=0x0 addr=0x14 pc=0x44206a]

但是当我在 goroutine 中删除所有 errMsg 插入时,该函数就可以工作了。我不知道我做错了什么。


慕容森
浏览 172回答 1
1回答

Smart猫小萌

可能err是nil从ValidateName(),ValidateEmail()或ValidatePassword()调用返回时。您应该err != nil在将其添加到地图之前进行检查。if err != nil {    mutex.Lock()    errMsg["xxx"] = err.Error()    mutex.Unlock()}换句话说,这不是问题所在的地图errMsg,而是您想要放入其中的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go