我有以下代码片段。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
提交
取消