golang channel

好风 发表于 2017-04-14T23:47:03.244335Z
引用地址:https://plus.ooclab.com/note/article/1362

golang 语言里的 channel 是核心特性之一

探索

从 channel 接受数据

package main

import "fmt"

func isClosed(c chan int) bool {
    select {
    case <-c:
        return true
    default:
        return false
    }
}

func main() {
    shutdownCh := make(chan int, 2)
    shutdownCh <- 10

    fmt.Println("select 1 : ", isClosed(shutdownCh))
    fmt.Println("select 2 : ", isClosed(shutdownCh))

    shutdownCh <- 20
    shutdownCh <- 30

    fmt.Println("recv 1 : ", <-shutdownCh)
    close(shutdownCh)
    fmt.Println("recv 2 : ", <-shutdownCh)

    fmt.Println("recv 3 : ", <-shutdownCh)
    fmt.Println("select 3 : ", isClosed(shutdownCh))
}

运行结果:

$ go version
go version go1.8.1 linux/amd64
$ go run t.go 
select 1 :  true
select 2 :  false
recv 1 :  20
recv 2 :  30
recv 3 :  0
select 3 :  true

特性 :

  • 阻塞的 channel 可以用 select 探测
  • 关闭的 channel 可以继续接受到数据
  • 关闭的 channel 如果没有数据,继续接收到的是其类型初始化值( int 为 0)