面试题答案
一键面试安全关闭一个channel的常规做法
在Go语言中,通常由发送方来关闭channel。例如:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch) // 发送方关闭channel
}()
for val := range ch {
fmt.Println(val)
}
}
这样接收方可以通过 for... range
循环来优雅地处理channel关闭后的情况,直到channel关闭,循环结束。
不能在多个goroutine中关闭同一个channel的原因及可能导致的错误
- 原因:Go语言的设计理念是每个资源应该有一个明确的所有者。关闭channel应该由负责向该channel发送数据的那个goroutine来完成,这有助于明确责任,避免混乱。
- 可能导致的错误:如果多个goroutine关闭同一个channel,会导致运行时错误
panic: close of closed channel
。这是因为当一个channel已经被关闭后,再次关闭它会触发这个panic。在多个goroutine竞争关闭同一个channel时,无法确定哪个goroutine会先关闭它,后续的关闭操作就会导致这个错误,使程序异常终止。