面试题答案
一键面试当一个通道被关闭后,对该通道进行接收操作会有以下状态变化:
- 如果通道中还有数据,接收操作会正常接收数据。
- 当通道中数据被接收完后,接收操作不会阻塞,会立即返回,且返回值为通道类型的零值和一个布尔值
false
,用于表示通道是否关闭。
以下是代码示例:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}()
for {
data, ok := <-ch
if!ok {
break
}
fmt.Println("Received:", data)
}
fmt.Println("Channel is closed")
}
在上述代码中:
- 首先创建了一个整数类型的通道
ch
。 - 在一个匿名goroutine中,向通道发送5个整数,然后关闭通道。
- 在主goroutine中,使用
for {}
循环持续从通道接收数据,ok
用于判断通道是否关闭。当ok
为false
时,表示通道已关闭,退出循环。