返回介绍

10.4.3 值为 nil 的通道

发布于 2024-08-14 12:50:32 字数 3657 浏览 0 评论 0 收藏 0

这节,您将了解到 值为 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 会得到不同的结果。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文