单向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的性质,看定义时箭头指向的方向即可,箭头指向channel,即数据流入channel,即只写不读,箭头从channel出来,即数据流出channel,即只读不写。

初始化

channel是一个原生类型,因此不仅支持被传递,还支持类型转换。只有在介绍了单向channel的概念后,读者才会明白类型转换对于channel的意义:就是在单向channel和双向channel之间进行转换。

ch4 := make(chan int)

ch5 := <-chan int(ch4)    //ch5是一个单向读取channel

ch6 := chan<- int(ch4)    //ch6是一个单向写入channel

channel示例

package main

import "fmt"

func counter(out chan<- int){
//单向用于写int数据
for x := 0; x<100; x++{
out <- x
}
close(out)
} func squarer(out chan<- int, in <-chan int){
//out:单向写int数据
//in: 单向读int数据
//从in中读取数据,写入到out
for v := range in {
out <- v * v
}
close(out)
} func printer(in <-chan int) {
for v := range in {
fmt.Println(v)
}
} func main(){
naturals := make(chan int)
squares := make(chan int) go counter(naturals)
go squarer(squares,naturals)
printer(squares)
}

  

关闭channel

直接使用Go语言内置的close()函数即可关闭:

close(ch)

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

x,ok := <-ch

如果ok的返回值是false,就表示channel已经被关闭

Go语言编程读书笔记:Go channel(2)的更多相关文章

  1. Go语言编程读书笔记:Go channel(1)

    Channel是Go语言在语言级别提供的goroutine间的通信方式.我们可以用channel在两个或多个goroutine之间传递消息.channel是进程内的通信方式,因此通过channel传递 ...

  2. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  3. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

  4. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  5. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  6. MacTalk·人生元编程 - 读书笔记

    简介 <MacTalk·人生元编程>是一本随笔文集,主要内容来自作者的微信公众平台"MacTalk By 池建强".本书撰写于2013年,书中时间线却不止于此.作者以一 ...

  7. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  8. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  9. JavaScript 函数式编程读书笔记2

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

随机推荐

  1. docker:构建nginx+php-fpm镜像(一):构建nginx自启动镜像

    步骤一:手动安装nginx环境,并记录全过程: #使用yum更新系统 yum -y update   #下面编译安装tengine,查看有哪些包需要安装 #安装wget包,用于获取安装软件包 yum ...

  2. 使用Let's Encrypt搭建永久免费的HTTPS服务

    1.概述1.1 HTTPS概述HTTPS即HTTP + TLS,TLS 是传输层加密协议,它的前身是 SSL 协议.我们知道HTTP协议是基于TCP的.简而言之HTTPS就是在TCP的基础上套一层TL ...

  3. 判断文件是否存在,不要用if exist和if not exist,因为他们会受到文件是否隐藏的影响,改用dir /a 命令代替

    @echo off & setlocal enabledelayedexpansionrem 判断文件是否存在,不要用if exist和if not exist,因为他们会受到文件是否隐藏的影 ...

  4. 如何找出单链表中的倒数第k个元素

    方法一:快慢指针法 在查找过程中,设置两个指针,初始时指向首元结点(第一个元素结点). 然后,让其中一个指针先前移k步. 然后两个指针再同时往前移动.当先行的指针值为NULL时,另一个指针所指的位置就 ...

  5. nginx1.14.0版本高可用——keepalived双机热备

    nginx不支持主从,所以我们需要使用keepalive支持高可用. keepalived重要知识点 在局域网内,每个主机上各安装一个keepalived,注意关闭防火墙firewalld,然后设定一 ...

  6. Linux 学习目录

    1 VIM 快捷键

  7. python的日志配置

    settings.py中 DEBUG_TOOLBAR_CONFIG = { "JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery ...

  8. .net 多线程之线程取消

    //线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据) //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己 //线程不能别人终止 ...

  9. Oracle数据库ORA-01109 数据库未打开

    引致 https://blog.csdn.net/colinmok/article/details/39504879?locationNum=11&fps=1  感谢! 在plsql创建了2表 ...

  10. ubuntu安装python版本的opencv

    安装命令: pip install opencv-python