golang channel关闭后,是否可以读取剩余的数据

Yishto 2021-08-20 21:44:18
Categories: Tags:

golang channel关闭后,其中剩余的数据,是可以继续读取的。

请看下面的测试例子。

创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channel中读取数据,输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
)


func main(){

ch := make(chan int, 3)

ch <-1
ch <-2
ch <-3

close(ch)
for value := range ch {
fmt.Println("value:", value)
}

}

output:

1
2
3
4
value: 1
value: 2
value: 3

可以看到,channel关闭之后,仍然可以从channel中读取剩余的数据,直到数据全部读取完成。

多说一点,对于一个关闭的channel,如果继续向channel发送数据,会引起panic。

如果继续读数据,得到的是零值(对于int,就是0)。

判断一个channel的方式有两种:

一种方式:

1
2
value, ok := <- ch

ok是false,就表示已经关闭。

另一种方式,就是上面例子中使用的方式:

1
2
3
4
for value := range ch {

}

如果channel被关闭,会跳出循环。