Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
72 lines (55 sloc) 1.73 KB

值为nil的通道

这节,您将了解到 值为 nil 的通道。这些是通道的特殊类型,因为它们总是阻塞的。空通道的使用说明在 nilChannel.go 中, 分为四个代码片段来介绍。

nilChannel.go 的第一部分如下:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

nilChannel.go 的第二段代码显示如下:

func add(c chan int) {
    sum := 0
    t := time.NewTimer(time.Second)
    for {
        select {
            case input := <-c:
                sum = sum + input
            case <-t.c:
                c = nil
                fmt.Println(sum)
        }
    }
}

add() 函数展示了如何使用空通道。<-t.c 表达式按在 time.NewTimer() 调用中指定的时间阻塞 t 计时器的 c 通道。不要混淆函数的参数 c 通道和 t 计时器的 t.c 通道。它会触发 select 表达式的相关分支的执行,给 c 通道分配 nil 值并打印 sum 变量。

nilChannel.go 的第三段代码如下:

func send(c chan int) {
    for {
        c <- rand.Intn(10)
    }
}

send() 函数的目的是产生随机数并持续发送它们到一个通道里,只要这个通道是打开的。

nilChannel.go 的其余代码如下:

func main() {
    c := make(chan int)
    go add(c)
    go send(c)
    time.Sleep(3 * time.Second)
}

使用 time.Sleep() 函数是为了给这俩个 goroutines 足够的操作时间。

执行 nilChannel.go 将产生如下输出:

$go run nilChannel.go
13167523
$go run nilChannel.go
12988362

由于执行 add() 函数中的 select 表达式的第一个分支的次数不固定,所以您执行 nilChannel.go 会得到不同的结果。

You can’t perform that action at this time.