Golang channel关闭的实现示例
作者:富士康质检员张全蛋
channel关闭不当或不关闭会引发很多问题,本文主要介绍了Golang channel关闭的实现示例,具有一定的参考价值,感兴趣的可以了解一下
使用内置函数close可以关闭channel,当channel关闭后,就不能再向channel写数据了,但是仍然可以从channel中读取数据。
一旦将channel关闭了,只能读不能写。相当于关闭管道就数据不能进入到队列里面了,只能进行读操作,只读不写。
channel支持for-range的方式进行遍历,请注意两个细节
(1)在遍历时,如果channel没有关闭,则回出现deadlock的错误
(2)在遍历时,如果channel已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。
下面这种遍历方式肯定是错误的,每次取出来数据长度都会减1,容量方式也一样不是真实的长度,所以只能使用for rang方式。
func main() { intChan := make(chan int, 3) intChan <- 100 intChan <- 200 close(intChan) //关闭管道 //当管道关闭之后,读取数据是没有问题的 num := <-intChan fmt.Println(num) //从管道里面依次取出这样的值,管道是先进先出的队列,值也是按照顺序取出来的 for v := range intChan { fmt.Println(v) } }
func main() { intChan := make(chan int, 3) //向管道写入数据 intChan <- 1 num := 2 intChan <- num for i := 0; i < 1; i++ { v, ok := <-intChan fmt.Println(v, ok) } fmt.Println(".....................") close(intChan) for i := 0; i < 10; i++ { v, ok := <-intChan fmt.Println(v, ok) } } 1 true ..................... 2 true 0 false 0 false 0 false 0 false 0 false 0 false 0 false 0 false 0 false
到此这篇关于Golang channel关闭的实现示例的文章就介绍到这了,更多相关Golang channel关闭内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!