使用范围应用程序中断循环通道后

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


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"


}

那是我的创建帐户功能。在三个 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"


}

你好将要打印出来,而且我得到了返回值。

我在第一个代码片段中做错了什么?


交互式爱情
浏览 198回答 2
2回答

绝地无双

该validation通道是永远不会关闭。for err := range validation {&nbsp; &nbsp; errColl[iterator] = err&nbsp; &nbsp; iterator++}带有“range”子句的“for”语句遍历数组、切片、字符串或映射的所有条目,或通道上接收到的值。对于通道,产生的迭代值是通道上发送的连续值,直到通道关闭。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go