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

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
}

如您所见,我使用了三个goroutine,并在goroutine中将其锁定以更改errMsg变量映射类型。运行函数时,出现编译器错误
runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x14 pc=0x44206a]

但是,当我在goroutine中删除所有errMsg插入内容时,该函数就会起作用。我不知道我做错了的原因。

最佳答案

errnilValidateName()调用返回时,ValidateEmail()可能是ValidatePassword()

您应先检查err != nil,然后再将其添加到 map 中。

if err != nil {
    mutex.Lock()
    errMsg["xxx"] = err.Error()
    mutex.Unlock()
}

换句话说,这不是问题的映射errMsg,而是您要放入其中的值。

07-26 09:29