美文网首页
Go语言中单向通道

Go语言中单向通道

作者: 码二哥 | 来源:发表于2020-02-14 16:06 被阅读0次

参考:
http://c.biancheng.net/view/99.html

关键点

通过关键词汇,实现快速理解,记忆目的

1、使用单向通道的目的

通道访问进行限制,从而增加接口的安全性

2、如何声明一个单向通道呢?

  • var 通道实例 chan<- 元素类型 // 只能发送通道

  • var 通道实例 <-chan 元素类型 // 只能接收通道

3、如何关闭通道呢?

close(ch)

4、如何判断通道是否已经关闭了?(使用阻塞式-接收数据)

  • x, ok := <-ch

  • ok为false时,说明已经关闭

Go语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel 只能用于发送或者接收数据。channel 本身必然是同时支持读写的,否则根本没法用。

假如一个 channel 真的只能读,那么肯定只会是空的,因为你没机会往里面写数据。同理,如果一个 channel 只允许写,即使写进去了,也没有丝毫意义,因为没有机会读取里面的数据。所谓的单向 channel 概念,其实只是对 channel 的一种使用限制。

1、单向通道的声明格式

我们在将一个 channel 变量传递到一个函数时,可以通过将其指定为单向 channel 变量,从而限制该函数中可以对此 channel 的操作,比如只能往这个 channel 写,或者只能从这个 channel 读。

单向 channel 变量的声明非常简单,只能发送的通道类型为chan<-,只能接收的通道类型为<-chan,格式如下:

var 通道实例 chan<- 元素类型    // 只能发送通道
var 通道实例 <-chan 元素类型    // 只能接收通道

元素类型:通道包含的元素类型。
通道实例:声明的通道变量。

2、单向通道的使用例子

示例代码如下:

ch := make(chan int)
// 声明一个只能发送的通道类型, 并赋值为ch
var chSendOnly chan<- int = ch
//声明一个只能接收的通道类型, 并赋值为ch
var chRecvOnly <-chan int = ch

上面的例子中,chSendOnly 只能发送数据,如果尝试接收数据,将会出现如下报错:

invalid operation: <-chSendOnly (receive from send-only type chan<- int)

同理,chRecvOnly 也是不能发送的。

当然,使用 make 创建通道时,也可以创建一个只发送或只读取的通道:

ch := make(<-chan int)
var chReadOnly <-chan int = ch
<-chReadOnly

上面代码编译正常,运行也是正确的。但是,一个不能填充数据(发送)只能读取的通道是毫无意义的。

3、time包中的单向通道

time 包中的计时器会返回一个 timer 实例,代码如下:

timer := time.NewTimer(time.Second)
timer的Timer类型定义如下:
type Timer struct {
    C <-chan Time
    r runtimeTimer
}

第 2 行中 C 通道的类型就是一种只能接收的单向通道。如果此处不进行通道方向约束,一旦外部向通道发送数据,将会造成其他使用到计时器的地方逻辑产生混乱。

因此,单向通道有利于代码接口的严谨性。

4、关闭 channel

关闭 channel 非常简单,直接使用 Go语言内置的 close() 函数即可:

close(ch)

在介绍了如何关闭 channel 之后,我们就多了一个问题:

4.1、如何判断一个 channel 是否已经被关闭?

我们可以在读取的时候使用多重返回值的方式:

x, ok := <-ch

这个用法与 map 中的按键获取 value 的过程比较类似,只需要看第二个 bool 返回值即可,如果返回值是 false 则表示 ch 已经被关闭。

相关文章

  • Go语言中单向通道

    参考:http://c.biancheng.net/view/99.html 关键点 通过关键词汇,实现快速理解,...

  • TODO:Go语言goroutine和channel使用

    TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语...

  • Go语言范围(Range)

    Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channe...

  • 增强for循环 for range

    Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channe...

  • [译]Go语言中的通道

    前言 继《[译]Go语言如何优雅地关闭channel》之后的另一篇译文。 原文介绍 原文来自Go101,该项目被托...

  • <>

    通道的高级玩法 单向通道 单向通道是只允许写或者读的通道,定义方式如下: 通道的读写 for语句读写 select...

  • Go语言 参数传递究竟是值传递还是引用传递的问题分析

    之前我们谈过,在Go语言中的引用类型有:映射(map),数组切片(slice),通道(channel),方法与函数...

  • Go语言指针

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。 接下来让我们来一步步学习 Go 语...

  • Go的内存管理

    本文翻译自Memory Management in Go,介绍了Go语言中内存管理的相关概念。 所有的计算机程序语...

  • Go类型转换(一)

    除常量、别名类型以及未命名类型外,Go强制要求使用显式类型转换。 1.语法歧义如果转换的目标是指针、单向通道或没有...

网友评论

      本文标题:Go语言中单向通道

      本文链接:https://www.haomeiwen.com/subject/ryfjfhtx.html