《Go语言编程》学习笔记——channel 3

第4章 并发编程


4.5 channel

channel的传递


在Go语言中channel本身也是一个原生类型,与map之类的类型地位一样,因此channel本身在定义后也可以通过channel来传递。

利用channel的这个可传递特性,我们可以实现非常强大、灵活的系统架构。相比之下,在C++、Java、C#中,要达成这样的效果,通常就意味着要设计一系列接口。

与Go语言接口的非侵入式类似,channel的这些特性也可以大大降低开发者的心智成本,用一些比较简单却实用的方式来达成在其他语言中需要使用众多技巧才能达成的效果。

没太明白

单向channel


单向channel只能用于发送或者接收数据。channel本身必然是同时支持读写的,否则根本没法用。假如一个channel真的只能读,那么肯定只会是空的,因为你没机会往里面写数据。同理,如果一个channel只允许写,即使写进去了,也没有丝毫意义,因为没有机会读取里面的数据。所谓的单向channel概念,其实只是对channel的一种使用限制。
我们在将一个channel变量传递到一个函数时,可以通过将其指定为单向channel变量,从而限制该函数中可以对此channel的操作,比如只能往这个channel写,或者只能从这个channel读。

//单向channel变量的声明
var ch1 chan int		//ch1是一个正常的channel,不是单向的
var ch2 chan<- float64	//ch2是单向channel,只用于写float64数据
var ch3 <-chan int		//ch3是单向channel,只用于读取int数据

//channel是一个原生类型,因此不仅支持被传递,还支持类型转换。
ch4  := make(chan int)
cha5 := <-chan int(ch4)	//ch5是一个单向的读取channel
cha6 := chan<- int(ch4)	//ch6是一个单向的写入channel

为什么要做这样的限制呢?从设计的角度考虑,所有的代码应该都遵循“最小权限原则”,
从而避免没必要地使用泛滥问题,进而导致程序失控
。写过C++程序的读者肯定就会联想起const指针的用法。非const指针具备const指针的所有功能,将一个指针设定为const就是明确告诉函数实现者不要试图对该指针进行修改。单向channel也是起到这样的一种契约作用。

关闭channel

//关闭channel
close(ch)		//Go语言内置close()函数关闭channel

_ , ok := <-ch	//判断一个channel是否已经被关闭,与map中按键获取值的过程类似,看第二个bool返回值即可,如果是false则表示channel已经被关闭

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值