返回介绍

09.4.1 通道的写入

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

这小节的代码将教您怎样往通道写入数据。写 x 值到 c 通道如同 c <- x 一样容易。这个箭头表示值的方向,只要 xc 是相同的类型用这个表达式就不会有问题。这节的示例保存在 writeCh.go 中,并分三部分介绍。

writeCh.go 的第一段代码如下:

package main

import (
    "fmt"
    "time"
)

func writeToChannel(c chan int, x int) {
    fmt.Println(x)
    c <- x
    close(c)
    fmt.Println(x)
}

chan 关键字是用于声明函数参数 c 是一个通道,并且伴随通道(int) 类型。c <-x 表达式允许您写 x 值到 c 通道,并用close() 函数关闭这个通道;那样就不会再和它通信了。

writeCh.go 的第二部分代码如下:

func main() {
    c := make(chan int)

上面的代码定义了一个名为 c 的通道变量,第一次在这章使用 make() 函数和 chan 关键字。所有的通道都有一个指定的类型。

writeCh.go 的其余代码如下:

    go writeToChannel(c, 10)
    time.Sleep(1 * time.Second)
}

这里以 goroutine 的方式执行 writeToChannel() 函数并调用 time.Sleep() 来给 writeToChannel() 函数足够的时间来执行。

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

$go run writeCh.go
10

奇怪的是 writeToChannel() 函数只打印了一次给定的值。这是由于第二个 fmt.Println(x) 表达式没有执行。一旦您理解了通道的工作原理,这个原因就非常简单了:c <- x 表达式阻塞了 writeChannel() 函数下面的执行,因为没人读取 c 通道内写入的值。所以,当 time.Sleep(1 * time.Second) 表达式结束的时候,程序没有等待 writeChannel() 就结束了。

下节将说明怎么从通道读数据。

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

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

发布评论

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