终止第二个 goroutine

我有以下代码片段。


package main


import (

    "errors"

    "fmt"

    "time"

)


func errName(ch chan error) {


    for i := 0; i < 10000; i++ {


    }


    ch <- errors.New("Error name")

    close(ch)

}


func errEmail(ch chan error) {


    for i := 0; i < 100; i++ {


    }

    ch <- errors.New("Error email")

    close(ch)

}


func main() {


    ch := make(chan error)


    go errName(ch)

    go errEmail(ch)

    fmt.Println(<-ch)

    //close(ch)


    time.Sleep(1000000)


}

如您所见,我让两个函数在 goroutine 中运行,errName 和 errEmail。我将一个带有错误类型的通道作为参数传递。如果其中一个先完成,它应该通过通道发送错误并关闭它。所以第二个仍在运行的 goroutine 不必再运行了,因为我已经收到错误并且我想终止仍在运行的 goroutine。这就是我在上面的例子中试图达到的。


当我运行程序时,出现错误


panic: send on closed channel


goroutine 6 [running]:

main.errEmail(0xc0820101e0)

        D:/gocode/src/samples/gorountine2.go:24 +0xfd

created by main.main

        D:/gocode/src/samples/gorountine2.go:33 +0x74


goroutine 1 [runnable]:

main.main()

        D:/gocode/src/samples/gorountine2.go:34 +0xac

exit status 2

我知道,当我删除 close 语句时,它不会恐慌,但是正在运行的 goroutine 上的通道仍在等待错误引用,这意味着它浪费了内存(等待)。


当其中一个向通道发送错误时,第二个错误我将不再关心,那就是我的目标。


慕码人2483693
浏览 198回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go