循环后,带有范围app的频道会中断

zer*_*ing 0 go

我有一个问题,我的应用程序在循环通道后不会到达下一个语句.为了澄清,我的意思是,请看下面的代码片段.

func CreateAccount(name, email, password string) (string, string) {

    validation := make(chan error)
    errColl := make([]error, 3, 3)
    iterator := 0

    go func() {
        nameErr := IsNameValid(name)
        validation <- nameErr
    }()

    go func() {
        emailErr := IsEmailValid(email)
        validation <- emailErr

    }()

    go func() {
        passwordErr := IsPasswordValid(password)
        validation <- passwordErr
    }()

    for err := range validation {
        errColl[iterator] = err
        iterator++
    }
    fmt.Println("Hello")


    return "hello", "dude"

}
Run Code Online (Sandbox Code Playgroud)

那是我的创建帐户功能.在三个goroutine之后,我在通道验证上做了一个循环.循环完成后,语句

fmt.Println("你好)

永远不会执行.但是当我改变这样的功能时.

func CreateAccount(name, email, password string) (string, string) {

    validation := make(chan error)
    errColl := make([]error, 3, 3)
    //iterator := 0

    go func() {
        nameErr := IsNameValid(name)
        validation <- nameErr
    }()

    go func() {
        emailErr := IsEmailValid(email)
        validation <- emailErr

    }()

    go func() {
        passwordErr := IsPasswordValid(password)
        validation <- passwordErr
    }()

    errColl[0] = <-validation
    errColl[1] = <-validation
    errColl[2] = <-validation
    close(validation)
    fmt.Println("Hello")

    return "hello", "dude"

}
Run Code Online (Sandbox Code Playgroud)

你好打印出来,加上我得到了返回值.
我在第一段代码中出了什么问题?

pet*_*rSO 7

validation通道是永远不会关闭.

for err := range validation {
    errColl[iterator] = err
    iterator++
}
Run Code Online (Sandbox Code Playgroud)

Go编程语言规范

对于陈述

带有"range"子句的"for"语句遍历数组,切片,字符串或映射的所有条目,或者在通道上接收的值.

对于通道,产生的迭代值是在通道上发送的连续值,直到通道关闭.