为了账号安全,请及时绑定邮箱和手机立即绑定

终止第二个 goroutine

终止第二个 goroutine

Go
慕码人2483693 2021-09-10 21:06:55
我有以下代码片段。package mainimport (    "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 channelgoroutine 6 [running]:main.errEmail(0xc0820101e0)        D:/gocode/src/samples/gorountine2.go:24 +0xfdcreated by main.main        D:/gocode/src/samples/gorountine2.go:33 +0x74goroutine 1 [runnable]:main.main()        D:/gocode/src/samples/gorountine2.go:34 +0xacexit status 2我知道,当我删除 close 语句时,它不会恐慌,但是正在运行的 goroutine 上的通道仍在等待错误引用,这意味着它浪费了内存(等待)。当其中一个向通道发送错误时,第二个错误我将不再关心,那就是我的目标。
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信