通道的写入
这小节的代码将教您怎样往通道写入数据。写 x
值到 c
通道如同 c <- x
一样容易。这个箭头表示值的方向,只要 x
和 c
是相同的类型用这个表达式就不会有问题。这节的示例保存在 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()
就结束了。
下节将说明怎么从通道读数据。