我有以下代码片段。
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 上的通道仍在等待错误引用,这意味着它浪费了内存(等待)。
当其中一个向通道发送错误时,第二个错误我将不再关心,那就是我的目标。
相关分类