上QQ阅读APP看书,第一时间看更新
5.2.1 channel写入数据
既然channel是用来传递数据的,那我们先来看看如何向channel写入数据。直接来看一个向channel写入数据的示例代码:
book/ch05/5.2/write/main.go
1. package main
2.
3. import (
4. "fmt"
5. "time"
6. )
7.
8. func main() {
9. c := make(chan int)
10. go writeChan(c,666)
11. time.Sleep(1*time.Second)
12. }
13.
14. func writeChan(c chan int ,x int) {
15. fmt.Println(x)
16. c <- x
17. close(c)
18. fmt.Println(x)
19. }
20. //以下为程序执行结果
21. 666
第14行至第19行,定义了一个函数,函数的参数c是chan类型,也就是channel类型。第16行中<-表达式的作用是将x值写入c channel内。第17行使用close函数关闭了这个channel,channel关闭以后就不可以进行通信了。在函数的开始和结束处,都打印了x变量。
第9行至第11行,先通过make定义了一个int类型的通道c。然后马上在第10行启动goroutine,并且把c作为channel参数、把数字666作为整型参数传递给函数writeChan。
下面来看程序的运行结果。第21行只打印了一次数字,不是应该在函数的开始和结束处分别打印一次数字x吗?是因为主goroutine结束导致没来得及打印第二次吗?不是的,其实是因为第11行已经休眠,拉长休眠时间并且多运行几次还是只会打印一次。
注意
当主goroutine结束的时候,所有其他的goroutine都会被强制结束。
这与channel的工作原理是有关的。执行完c<-x这行代码后,函数writeChan就进入阻塞状态,因为c中的数据一直没有其他goroutine读取,所以一直到主goroutine结束后面的代码都不会被执行。
注意
channel是goroutine之间同步的主要方式。在无缓存的channel中,每一次数据发送都对应着数据的接收。所谓无缓存channel是指用make创建channel时没有给第二个参数。make(chan int,3)这种属于有缓存channel。
接下来就来看一下goroutine如何从channel接收数据。