跟着猫哥学Golang 17 - Channel 进阶

上一章降到了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...")
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值