企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# **通道的写入** 这小节的代码将教你怎样往通道写入数据。把 `x` 值写到 `c` 通道,通过 `c <- x` 就可以实现,这非常简单。这个箭头表示值的方向,只要 `x` 和 `c` 是相同的类型,用这个表达式就不会有问题。这节的示例保存在 `writeCh.go` 中,并分三部分介绍。 `writeCh.go` 的第一段代码如下: ```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` 的第二部分代码如下: ```go func main() { c := make(chan int) ``` 上面的代码定义了一个名为 `c` 的通道变量,第一次在这章使用 `make()` 函数和 `chan` 关键字。所有的通道都有一个指定的类型。 `writeCh.go` 的其余代码如下: ```go go writeToChannel(c, 10) time.Sleep(1 * time.Second) } ``` 这里以 goroutine 的方式执行 `writeToChannel()` 函数并调用 `time.Sleep()` 来给 `writeToChannel()` 函数足够的时间来执行。 执行 `writeCh.go` 将产生如下输出: ```shell $go run writeCh.go 10 ``` 奇怪的是 `writeToChannel()` 函数只打印了一次给定的值。这是由于第二个 `fmt.Println(x)` 表达式没有执行。一旦你理解了通道的工作原理,这个原因就非常简单了:`c <- x` 表达式阻塞了 `writeChannel()` 函数下面的执行,因为没人读取 `c` 通道内写入的值。所以,当 `time.Sleep(1 * time.Second)` 表达式结束的时候,程序没有等待 `writeChannel()` 就结束了。 下节将说明怎么从通道读数据。