跟着猫哥学Golang 17 - Channel 进阶

来源:互联网 发布:淘宝网欧时力 编辑:程序博客网 时间:2024/04/28 14:24

上一章降到了Golang的channel有队列的特性,那么逻辑上很自然地可以引出两个操作:

  • 循环channel元素;
  • 关闭channel;

依次循环channel中的内容是很容易理解的,先进先出。举个栗子:

package mainimport "fmt"func main() {var pow = []int{1, 2, 4, 8, 16}c := make(chan int, 5)for _,i := range pow {c<-i}for j := range pow {j = <-cfmt.Println(j)}}
结果:
1
2
4
8
16


关闭channel也是非常有用的一种操作,看下面:

package mainimport "fmt"func main() {var pow = []int{1, 2, 4, 8, 16, 32, 64, 128, 256,512}c := make(chan int, 10)for i,v := range pow {if i == 5 {close(c)break} else {c<-v}}for j := range c {fmt.Println(j)}}结果:124816


另外,关于channel的关闭,有几个问题需要注意:

1. 不能两次关闭一个channel,否则会报错;

ch := make(chan int)close(ch)// close(ch)  // 第一次以后的关闭,会panic的。

2. 不能往关闭的channel里写内容;

ch := make(chan string)close(ch)i := <- ch //会报错的...

3. 判断channel 是否关闭

_, ok := <- chif ok {    fmt.Println("channel not closed...")} else {    fmt.Println("channel closed...")}

0 0