我尝试编写一个验证数据的函数。看下面的代码: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,而是您想要放入其中的值。
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消