Go Channel
在Go中,多个goroutines推荐使用channel来进行通信。使用channel来共享内存。
go中channel有三种类型:读写channel
, 只读channel
,只写的channel
默认为读写的channel:
1 | c := make(chan int) |
同时channel还可以有缓存。定义如下:
1 | c := make(chan int, 2) |
上述定义了带有2个元素缓存的,channel
一般只读或只写的channel,大多出现在函数传参中,当然也可以直接定义:
1 | c1 := make(<-chan int) // 定义了一个只读的channel |
注意:
对于缓存的channel,写数据也是阻塞的,直到将channel中的数据读出;读也是阻塞的,直到channel中有数据可读
1
2
3
4
5
6
7
8
9func main() {
c := make(chan bool)
go func() {
fmt.Println("Go GO Go !!")
c <- true
}()
<- c // 等待读取数据,
}
对于带缓存的channel,在使用时,一定要注意如下情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 下面这种情况,需要注意,channel是否有缓存
// 否则在实际的开发中,很有可能goroutines还没有执行
// 程序就结束了。
func main() {
//c := make(chan bool, 1)
c := make(chan bool)
go func() {
fmt.Println("Go GO Go !!")
<- c
}()
// 对于无缓存时,如果没有读取channle中的数据,写也是阻塞的,必须将数据
// 读取了之后,才能退出
// 对于有缓存的channel,我把数据写进去就是,不管你是否读取。
c <- true
}
判断channel是否关闭
判断channnel是否关闭,是在接收channel的数据时候,判断的:
1 | v, ok := <-c // 如果channel关闭了,ok = false |
特别在for range
循环遍历channel时,必须使用Close()
函数关闭channnel,表示结束数据的写入,同时for循环也终止。