Tags: channel
[多选题]关于channel的特性,下面说法正确的是()
A
给一个 nil channel 发送数据,造成永远阻塞
B
从一个 nil channel 接收数据,造成永远阻塞
C
给一个已经关闭的 channel 发送数据,引起 panic
D
从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
回答错误!正确答案是 A,B,C,D
解释:
1、给一个 nil channel 发送数据,造成永远阻塞
以下这个程序将在第5行造成死锁,因为未初始化的 channel 是 nil 的,其值是零
package main
func main() {
var c chan string
c <- "let's get started" // deadlock
}
2、类似的,从一个 nil channel 接收数据,会造成接受者永远阻塞。
package main
import "fmt"
func main() {
var c chan string
fmt.Println(<-c) // deadlock
}
3、给一个已经关闭的 channel 发送数据,引起 panic
以下程序将有可能 panic,因为在它的兄弟姐妹有时间完成发送他们的值之前,这第一个 goroutine 在达到10的时候将关闭 channel。
package main
import "fmt"
func main() {
var c = make(chan int, 100)
for i := 0; i < 10; i++ {
go func() {
for j := 0; j < 10; j++ {
c <- j
}
close(c)
}()
}
for i := range c {
fmt.Println(i)
}
}
4、从一个已经关闭的 channel 接收数据,立即返回一个零值
这最后一个示例与前一个是相反的,一旦一个 channel 被关闭,它的所有的值都会从 buffer 中流失,channel 将立即返回0值。
package main
import "fmt"
func main() {
c := make(chan int, 3)
c <- 1
c <- 2
c <- 3
close(c)
for i := 0; i < 4; i++ {
fmt.Printf("%d ", <-c) // prints 1 2 3 0
}
}
网友评论