面试题答案
一键面试在Go语言中,当一个通道被关闭后继续读取,会读到该通道类型的零值,且第二个返回值(ok)为 false
。
以下是两种处理这种异常情况的常规方式:
方式一:通过第二个返回值判断通道是否关闭
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go func() {
ch <- 10
close(ch)
}()
for {
data, ok := <-ch
if!ok {
break
}
fmt.Println("Received:", data)
}
fmt.Println("Channel is closed.")
}
在上述代码中,通过 data, ok := <-ch
接收通道数据并获取通道状态 ok
,当 ok
为 false
时,表示通道已关闭,从而跳出循环。
方式二:使用 for... range
循环
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go func() {
ch <- 20
close(ch)
}()
for data := range ch {
fmt.Println("Received:", data)
}
fmt.Println("Channel is closed.")
}
这里使用 for... range
循环来读取通道数据,当通道关闭时,循环会自动结束。