Go语言编程读书笔记:Go channel(1)
Channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以用channel在两个或多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数是的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,建议用分布式系统的方法来解决,比如用socket或HTTP等通信协议。
channel是类型相关的,也就是说,一个channel只能传递一种类型的值。这个类型需要在声明channel时指定。
一般channel的声明形式为:
var chanName chan ElementType
举个栗子,我们声明一个传递类型为int的channel:
var ch chan int
或者声明一个map,元素是bool的channel:
var m map[string] chan bool
定义一个channel,直接使用make()函数即可:
ch := make(chan int)
在channel的用法中,最常见的包括写入和读出,将一个数据写入channel的语法很直观:
ch <- value
向channel写入数据通常会导致程序阻塞,直到有其他goroutine从这个channel中读取数据,从channel中读取数据的语法是:
value := <- ch
示例:
在这个例子中,我们定义了一个10个channel的数组chs,并把数组中的每个channel分配给10个不同的goroutine,在每个goroutine的print完成后,我们通过ch <- 1向channel中写入一个数据,在这个channel被读取前,这个操作是阻塞的。在所有goroutine启动完成后,我们通过<-ch从10个channel中依次读取数据,在数据写入channel前,这个操作也是阻塞的。这样就实现了锁的功能。
package main import (
"fmt"
"time"
) func Count(ch chan int) {
fmt.Println("Counting")
time.Sleep(time.Second)
ch <- 1
} func main(){
chs := make([]chan int,10)
for i := 0;i<10;i++ {
chs[i] = make(chan int)
go Count(chs[i])
} for _,ch := range(chs){
<-ch
}
}
坑:
channel默认上是阻塞的,也就是说,如果Channel满了,就阻塞写,如果Channel空了,就阻塞读。于是,我们就可以使用这种特性来同步我们的发送和接收端。
channel <-,发送一个新的值到通道中 <-channel,从通道中接收一个值,这个更像有两层含义,一个是会返回一个结果,当做赋值来用:msg := <-channel;另外一个含义是等待这个channel发送消息,所以还有一个等的含义在.所以如果你直接写fmt.Print(<-channel)本意只是想输出下这个chan传来的值,但是其实他还会阻塞住等着channel来发.
默认发送和接收操作是阻塞的,直到发送方和接收方都准备完毕。
package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "ping"
}()
msg := <-messages
fmt.Println(msg)
}
//output:ping
如果是下面这样写,就会报错,因为msg还在等待message来传送值
func main() {
messages := make(chan string)
msg := <-messages
messages <- "ping"
fmt.Println(msg)
}
//fatal error: all goroutines are asleep - deadlock!
//goroutine 1 [chan receive]:
Go语言编程读书笔记:Go channel(1)的更多相关文章
- Go语言编程读书笔记:Go channel(2)
单向channel 概念 单向channel是只能用于发送或者接收数据,channel本身必然是同时支持读写,否则根本没法用.假如一个channel只能读,那么肯定只会是空的,因为你没有机会向里面写数 ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- Node.js高级编程读书笔记Outline
Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- MacTalk·人生元编程 - 读书笔记
简介 <MacTalk·人生元编程>是一本随笔文集,主要内容来自作者的微信公众平台"MacTalk By 池建强".本书撰写于2013年,书中时间线却不止于此.作者以一 ...
- unix环境高级编程-读书笔记与习题解答-第一篇
从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...
- UNIX网络编程--读书笔记
会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...
- JavaScript 函数式编程读书笔记2
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...
随机推荐
- git 本地修改、撤消操作
// 撤消本地文件的修改,还原到最近版本 git checkout -- * 是撤销从上次提交之后所做的所有修改 git checkout -- <filaname> 是撤销从上次提交之后 ...
- Oracle中函数/过程返回多个值(结果集)
Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. (1) 返回游标: return的类型为:SYS_REFCUR ...
- 01-使用eclipse新建一个标准的 java web项目
1.使用eclipse创建个普通的Java SE项目 名称:CRM java web标准目录结构 crm WEB-INF classes lib web.xml 设置项目字节码输出目录
- WinForm-简单21点纸牌小游戏
纸牌游戏有很多种玩法,C#代码写的纸牌游戏,网上也能找到不少,从中也能学习到不少知识,自己动手也写一个,算是记录下学习过程吧. 纸牌21点的玩法也比较简单,就是看谁手中的所有牌相加是21点,或是离21 ...
- Spring Boot 集成 logback日志
application.properties 配置logback.xml 路径注:如果logback.xml在默认的 src/main/resources 目录下则不需要配置application.p ...
- 如何快速扫描C段(网站快照、后台识别/登录、目录扫描)
1.C段扫描 C类地址范围从 192.0.0.1 到 223.255.255.254 ,192转换成二进制就是1100000:223转换成二进制就是1101111:所以说网络地址的最高位肯定是110开 ...
- 文件服务之二:ftp协议
FTP连接 命令连接 传输命令(客户端发给服务端的命令),服务端的21/tcp 数据连接 传输数据(传输数据时建立,数据传输完拆除) 数据链接的建立方法:主动.被动 主动模式(PORTstyle服务器 ...
- linux中ip命令使用介绍
ifconfig是CentOS 5.6系统中经典的配置网络的命令,但是到了CentOS 7的时候,命令就变成了ip了,我们也要学习,我们也要与时俱进.跟随高手一起学习 查看链路 ip link sho ...
- ssh 使用技巧
参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH Config 那些你所知道和不知道的事 预览目录 配置项说明 相关技巧 管理多组 ...
- app常见专项测试点
转载自 https://blog.csdn.net/xiaomaoxiao336368/article/details/84887948