美文网首页
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