go语言学习(五):通道的用法


本文摘自网络,作者,侵删。

go语言的作者Rob Pike认为,不要通过共享内存来实现通信,而应该通过通信来共享内存。多个goroutine之间可以通过通道来传递数据。通道是并发安全的,类似于一个FIFO的队列。go语言的通道定义需要使用make语句,如下,定义了一个存放3个int类型元素通道并向通道中输入了3个元素。同时用for循环取出。

func main() {
  ch1 := make(chan int, 3)
  ch1 <- 2
  ch1 <- 1
  ch1 <- 3
  close(ch1)
  for elem1 := range ch1 {
    fmt.Printf("The first element received from channel ch1: %v\n", elem1)
  }
}

上面的代码会在循环中不断从通道中取出元素,即使通道已经关闭了也会取出剩下的元素。如果通道没有关闭并且取完了通道中的元素,循环就会阻塞。

注意:

1)通道发送完数据后应该关闭。

2)发送操作和接受操作都会阻塞通道。

3)如果不指定通道的容量,那通道容量默认是0,称作非缓存通道;如果指定通道ro容量,如上面示例,称作缓存通道。

4)如果缓存通道容量满了,发送操作就会阻塞,直到接收通道接收了元素;如果通道空了,接收操作就会阻塞,直到有元素写入通道。如果是非缓存通道,则发送操作和接收操作都在执行时才不会被阻塞。这就说明缓存通道是一个异步操作,而非缓存通道是一个同步操作。

5)以下几种情况会跑出panic。

a.关闭一个已经关闭的通道

b.向关闭的通道发送或接收数据

c.通道没有初始化,而是一个nil

阅读剩余部分

相关阅读 >>

Golang源代码阅读,sync系列-once

解决使用Go get命令被墙的问题

Go接口interface的用法介绍

windows下如何玩转火热的Go-zero

Go语言————3、编辑器、集成开发环境与其它工具

Golang nil什么意思

深度解析Golang sync.once源码

Golang环境怎么安装

关于Golang 指针理解

Golang如何删除数组中的元素

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...