【GoLang】关于通道Channel 的关闭
在 Go 语言中,通过内置的 close
函数可以关闭一个通道(Channel)。当一个通道被关闭后,我们可以通过在接收操作中测试通道是否关闭来判断通道是否已经到达了它的结束。
关闭通道后,尝试向通道发送数据会引发 panic。然而,从已关闭的通道接收数据直到所有发送的值都被接收之后,才会返回一个零值。
以下是关闭通道的几种方法:
方法一:使用内置的 close
函数
package main
import "fmt"
func main() {
channel := make(chan int, 5)
for i := 0; i < 5; i++ {
channel <- i
}
close(channel)
for {
element, ok := <-channel
if !ok {
break
}
fmt.Println(element)
}
}
在这个例子中,我们首先创建了一个可以存储5个整数的通道,然后我们向通道中发送5个整数。然后我们关闭通道。然后我们尝试从通道接收数据,如果通道关闭,那么接收操作将返回一个零值,并且第二个值将是 false
。我们可以利用这个特性来判断通道是否关闭。
方法二:使用 range
关键字
package main
import "fmt"
func main() {
channel := make(chan int, 5)
for i := 0; i < 5; i++ {
channel <- i
}
close(channel)
for element := range channel {
fmt.Println(element)
}
}
在这个例子中,我们使用 range
关键字来遍历通道。当通道关闭时,range
会自动停止,所以我们不需要手动检查通道是否关闭。
注意:
- 只有发送者才能关闭通道,接收者不能关闭通道。如果尝试关闭一个已经被关闭的通道,程序会 panic。
- 关闭之后,通道中所有已经存储的值都会被接收。一旦通道关闭,再向通道发送数据会引发 panic。但是,可以继续从通道接收数据,直到通道中所有的值都被接收为止。
评论已关闭