golang channel tips

1. 读nil的channel是永远阻塞的。关闭nil的channel会造成panic。

2. closed channel的行为:

向close的channel发消息会panic。因为go建议向channel发送数据的人负责close channel。

如果close的channel还有数据,仍然可以读取。

读取close的并且空的channel,会马上返回零值(注意chan int会返回0)。

A channel "close" is really just a send of a special value on a channel.

3. 可以对channel使用range。这样不用写select,显得代码简洁。

4. ok=false表示channel空并且close了 (注意不是“或者”)。

参考:

https://stackoverflow.com/questions/34897843/why-does-go-panic-on-writing-to-a-closed-channel

原文地址:https://www.cnblogs.com/dearplain/p/9246558.html

时间: 2024-10-09 05:21:05

golang channel tips的相关文章

Golang Channel用法简编

转自:http://tonybai.com/2014/09/29/a-channel-compendium-for-golang/ 在进入正式内容前,我这里先顺便转发一则消息,那就是Golang 1.3.2已经正式发布了.国内的golangtc已经镜像了golang.org的安装包下载页面,国内go程序员与爱好者们可以到"Golang中 国",即golangtc.com去下载go 1.3.2版本. Go这门语言也许你还不甚了解,甚至是完全不知道,这也有情可原,毕竟Go在TIOBE编程语

golang channel本质——共享内存

channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键.channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递,由于goroutine是轻量级的线程能够在语言层面调度,所以channel在golang中也常被用来同步goroutine. 一般channel的声明形式为:var chanName chan ElementType ElementType指定这个channel所能传递的元素类型. 定义一个cha

golang channel 用法

一.Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论.但就像John Graham-Cumming所说的那样,多数Golang程序员或爱好者仅仅停留在“知道”这一层次,理解CSP理论的并不多,毕竟多数程序员是搞工程 的.不过要想系统学习CSP的人可以从这里下载到CSP论文的最新版本. 维基百科中概要罗列了CSP模型与另外一种并发模型Actor模型的区别: Actor模型广义

golang channel 使用总结

原文地址 不同于传统的多线程并发模型使用共享内存来实现线程间通信的方式,golang 的哲学是通过 channel 进行协程(goroutine)之间的通信来实现数据共享: Do not communicate by sharing memory; instead, share memory by communicating. 这种方式的优点是通过提供原子的通信原语,避免了竞态情形(race condition)下复杂的锁机制.channel 可以看成一个 FIFO 队列,对 FIFO 队列的读

golang channel select

尝试多个channel同时触发时,select的表现: package main import ( "fmt" "time" ) func loop(ch chan int){ for i := 0; i < 10; i++ { ch <- i } close(ch) } func main() { ch1 := make(chan int, 100) ch2 := make(chan int, 100) go loop(ch1) go loop(ch2

Golang channel 的基本使用方法

package main import ( "fmt" "learner/Add" "time" ) //a. 普通类型,普通变量保存的就是值,也叫值类型 //b. 获取普通变量的内存地址,用&,比如: var a int, 获取a的内存地址:&a //c. 指针类型,指针变量存的就是一个内存地址,这个地址指向值 //d. 获取指针类型所指向的值,使用:*,比如:var *p int, 使用*p获取p指向的值 //e. 将一个内存

golang channel多生产者和多消费者实例

package main import ( "fmt" "time" ) func consumer(cname string, ch chan int) { //可以循环 for i := range ch 来不断从 channel 接收值,直到它被关闭. for i := range ch { fmt.Println("consumer-----------", cname, ":", i) } fmt.Println(&

[golang] channel通道

说明 channel是go当中的一个核心类型,可以看做是管道.并发核心单元可以通过channel进行数据的发送和接收,从而实现通信. 在go中,channel是一种数据类型,主要被用来解决协程的同步问题以及协程之间数据共享(数据传递)的问题. go当中的goroutine运行在相同的地址空间,因此访问共享内存地址必须做好同步,goroutine奉行通过通信来共享内存,而不是共享内存来通信. 引用类型channel可用于多个goroutine通讯,在其内部实现了同步,确保并发安全. 定义chann

go中有缓存通道和无缓存通道区别

golang channel 有缓冲 与 无缓冲 是有重要区别的 我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式 其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别 那就是一个是同步的 一个是非同步的 怎么说?比如 c1:=make(chan int)        无缓冲 c2:=make(chan int,1)      有缓冲 c1<-1 无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c