上一章降到了Golang的channel有队列的特性,那么逻辑上很自然地可以引出两个操作:
- 循环channel元素;
- 关闭channel;
依次循环channel中的内容是很容易理解的,先进先出。举个栗子:
package main
import "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 = <-c
fmt.Println(j)
}
}
结果:
1
2
4
8
16
关闭channel也是非常有用的一种操作,看下面:
package main
import "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)
}
}
结果:
1
2
4
8
16
另外,关于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 := <- ch
if ok {
fmt.Println("channel not closed...")
} else {
fmt.Println("channel closed...")
}