广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言单向通道的实现
  • 454
分享到

Go语言单向通道的实现

Go语言单向通道Go单行道 2023-05-14 11:05:51 454人浏览 八月长安
摘要

目录单向通道的声明格式单向通道的使用例子 time包中的单向通道关闭 channelGo语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel

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

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

单向通道的声明格式

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

单向 channel 变量的声明非常简单,只能写入数据的通道类型为chan<-,只能读取数据的通道类型为<-chan,格式如下:

var 通道实例 chan<- 元素类型    // 只能写入数据的通道
var 通道实例 <-chan 元素类型    // 只能读取数据的通道

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

单向通道的使用例子

示例代码如下:

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

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

 time包中的单向通道

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

timer := time.NewTimer(time.Second)

timer的Timer类型定义如下:

type Timer struct {
    C <-chan Time
    r runtimeTimer
}

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

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

关闭 channel

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

close(ch)

在介绍了如何关闭 channel 之后,我们就多了一个问题:如何判断一个 channel 是否已经被关闭?我们可以在读取的时候使用多重返回值的方式:

x, ok := <-ch

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

到此这篇关于Go语言单向通道的实现的文章就介绍到这了,更多相关Go语言单向通道内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言单向通道的实现

本文链接: https://www.lsjlt.com/news/203084.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言单向通道的实现
    目录单向通道的声明格式单向通道的使用例子 time包中的单向通道关闭 channelGo语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel ...
    99+
    2023-05-14
    Go语言单向通道 Go单行道
  • Go语言单向通道如何实现
    今天小编给大家分享一下Go语言单向通道如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Go语言的类型系统提供了单方向的...
    99+
    2023-07-05
  • Go语言带缓冲的通道实现
    Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收...
    99+
    2022-06-07
    GO 缓冲 go语言
  • Go语言如何实现带缓冲的通道
    这篇文章主要介绍Go语言如何实现带缓冲的通道,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是gogo是golang的简称,golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程...
    99+
    2023-06-14
  • Go语言通道之缓冲通道实例分析
    这篇“Go语言通道之缓冲通道实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言通道之缓冲通道实例分析”文章吧。有...
    99+
    2023-07-02
  • Go语言通道之无缓冲通道实例分析
    这篇文章主要讲解了“Go语言通道之无缓冲通道实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言通道之无缓冲通道实例分析”吧!一、通道是什么?其实无论是原子函数还是共享锁都是通过共...
    99+
    2023-07-02
  • Go语言中的通道channel详情
    目录一、Go语言通道基础概念1.channel产生背景2.channel工作方式二、通道使用语法1.通道的声明与初始化2.将数据放入通道内3.从通道内取出数据4.关闭通道close三...
    99+
    2022-11-13
  • Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据 在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如...
    99+
    2022-11-11
  • Go语言中通道channel的示例分析
    这篇文章将为大家详细讲解有关Go语言中通道channel的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Go语言通道基础概念1.channel产生背景    线程...
    99+
    2023-06-29
  • Go语言如何实现JavaScript重定向?
    在Web开发中,重定向是一种常见的技术手段,它可以将用户从一个网页引导到另一个网页。在JavaScript中,我们可以使用window.location.href或者window.location.replace来实现重定向,那么在Go语...
    99+
    2023-09-19
    重定向 javascript unix
  • 深入理解Go语言文档中的io.Pipe函数实现管道通信
    深入理解Go语言文档中的io.Pipe函数实现管道通信,需要具体代码示例引言:在Go语言中,通过io.Pipe函数可以方便地实现管道通信。本文将深入探讨io.Pipe函数的使用方法,并通过具体的代码示例来展示其功能和使用场景。一、io.Pi...
    99+
    2023-11-04
    管道通信 关键词:Go语言 ioPipe
  • Go语言单例模式怎么实现
    这篇文章主要介绍“Go语言单例模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言单例模式怎么实现”文章能帮助大家解决问题。什么是单例模式单例模式指仅允许创建一个对象的设计模式。它通常...
    99+
    2023-07-05
  • Go语言中如何实现路由的重定向
    Go语言中如何实现路由的重定向,需要具体代码示例在 Web 开发中,路由 (Router) 是指根据 URL 解析出对应的处理器 (Handler),并交由该处理器处理请求的过程。重定向 (Redirect) 则是指在服务器内部将用户请求从...
    99+
    2023-12-17
    Go语言实现 路由重定向 重定向实现方法
  • Go语言中的单例模式怎么实现
    本篇内容介绍了“Go语言中的单例模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是单例模式单例模式指仅允许创建一个对象的设计模...
    99+
    2023-07-05
  • Go语言实现的语言有哪些
    这篇文章主要讲解了“Go语言实现的语言有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言实现的语言有哪些”吧!01 Go+这是国内七牛老大许式伟主导的,对 Go 语言的扩展,专为数...
    99+
    2023-06-15
  • Go语言实现UDP协议及TCP通讯
    ⼀、使用Golang创建⼀一个TCP连接 1.服务端处理理流程 a.监听端口b.接受客户端的链接c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goro...
    99+
    2022-11-13
  • GO语言中通道和sync包的使用教程分享
    目录GO通道和 sync 包的分享通道是什么通道能做什么通道有哪几种无缓冲通道有缓冲的通道单向通道如何创建和声明一个通道声明通道初始化通道如何操作 channel通道异常情况梳理每一...
    99+
    2023-02-24
    GO 通道使用 GO sync包使用 GO 通道 GO sync包
  • Go 语言简单实现Vigenere加密算法
    目录Vigenere 加密算法Go 代码Vigenere 加密算法 该密码由意大利密码学家 Giovan Battista Bellaso 于 1553 年发明,但几个世纪以来一直归...
    99+
    2022-11-11
  • Go语言中如何实现路由的反向代理
    Go语言中实现路由的反向代理引言:随着互联网的发展,网络请求转发和代理成为了开发中的常见需求。在Go语言中,反向代理是一种常用的技术,它可以将客户端的请求转发到不同的后端服务器。本文将介绍如何使用Go语言实现路由的反向代理。一、什么是反向代...
    99+
    2023-12-17
    Go语言 路由 反向代理
  • Go语言网络编程:Go实现简单的内网穿透
    一、内网穿透 1. 内网穿透介绍 内网穿透是一种通过互联网建立远程连接到私有网络(内网)中设备的技术。通常情况下,内网设备由于位于一个受限制的网络环境中,无法直接从外部访问。内网穿透通过将内网设备的流...
    99+
    2023-09-02
    golang 服务器 计算机网络
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作