美文网首页
2019-06-03

2019-06-03

作者: vicas | 来源:发表于2019-06-03 19:58 被阅读0次

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
            }
}

相关文章

网友评论

      本文标题:2019-06-03

      本文链接:https://www.haomeiwen.com/subject/iyyhxctx.html