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

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

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

Go
慕容森 2021-08-16 16:13:06
我尝试编写一个验证数据的函数。看下面的代码: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 插入时,该函数就可以工作了。我不知道我做错了什么。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

可能err是nil从ValidateName(),ValidateEmail()或ValidatePassword()调用返回时。


您应该err != nil在将其添加到地图之前进行检查。


if err != nil {

    mutex.Lock()

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

    mutex.Unlock()

}

换句话说,这不是问题所在的地图errMsg,而是您想要放入其中的值。


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

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