首页 > 试题广场 >

关于channel的特性,下面说法正确的是()

[不定项选择题]
关于channel的特性,下面说法正确的是()
  • 给一个 nil channel 发送数据,造成永远阻塞
  • 从一个 nil channel 接收数据,造成永远阻塞
  • 给一个已经关闭的 channel 发送数据,引起 panic
  • 从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
func main() {
     var ch chan int = nil   //make(chan int)
     go func() {
         for i := 1; i < 10; i++ {
             ch <- 5
         }
         close(ch)
     }()
     for i := 0; i < 15; i++ {
         fmt.Println(<-ch)
     }
}

测试代码,但通道为空时,会报deadlock错误。
fatal error: all goroutines are asleep - deadlock!
编辑于 2018-04-23 20:05:56 回复(3)
更多回答
nil channel代表channel未初始化,向未初始化的channel读写数据会造成永久阻塞。Ps.关闭(close)未初始化的channel会引起panic。
发表于 2018-12-11 00:40:16 回复(1)
nil channel收发数据会阻塞。
已经关闭的channel不能再发(会panic),已经关闭的channel可以再收数据,返回0值和false。
关闭nil channel(未初始化)会panic,关闭已经关闭的channel会panic。
发表于 2020-11-17 17:27:09 回复(0)
我觉的 A , B 选项有歧义, nil channel 为什么不写成 无缓冲channel,这样好理解一点
发表于 2018-11-22 15:06:51 回复(3)
从一个已经关闭的channel中读数据只能得到0值
发表于 2018-10-18 10:23:55 回复(5)
func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool {  if c == nil {  if !block {  return false  }  gopark(nil, nil, waitReasonChanSendNilChan, traceEvGoStop, 2)  throw("unreachable")  }

nil channel 读写时
  gopark(nil, nil, waitReasonChanSendNilChan, traceEvGoStop, 2) 
这句话被执行了,协程挂起了,所以 A B 是正确的

发表于 2020-06-23 17:03:18 回复(0)
永久阻塞就是死锁
发表于 2025-09-19 12:32:41 回复(0)
这题答案是ABCD,没问题
发表于 2024-09-14 10:25:42 回复(0)
不知道效果可以试一试嘛,又不难写
	// var a chan int // nil channel
	var a chan int = make(chan int)
	close(a) // close channel
	a <- 1
	fmt.Print(<-a)


发表于 2024-06-16 23:53:14 回复(0)
chan 有 no block 读写吧
发表于 2022-02-28 12:05:24 回复(0)
nil channel表示未初始化的。。向里面读写会panic吧
发表于 2020-06-12 14:36:42 回复(0)
感觉有点争议,nil channel代表是初始化的还是没有初始化的
发表于 2020-03-08 15:29:30 回复(0)
go中实现try catch finally的机智是defer,panic,recover机制。对已经关闭的channel发送数据会导致panic异常
发表于 2018-02-06 10:52:55 回复(0)