【Golang】通道channel

冉小妹Ran · · 521 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Java的并发:基于线程
Golang的并发:基于协程goroutine

并发会导致资源竞争:加锁
防止资源竞争的三种方式:

  1. 原子函数:atomic.LoadInt32,atomic.StoreInt32
  2. 互斥锁:mutex sync.Mutex, mutex.Lock(), mutex.Unlock()
  3. 通道:channel

通道Channel

声明

使用chan声明通道,并指明需要发送和接收的数据类型。例如:

ch := make(chan int) 

声明通道可以有第二个参数,用来指定通道大小。

ch := make(chan int)      
ch := make(chan int, 0)
ch := make(chan int, 2)

第一种和第二种等价,都为无缓冲通道。第三种为有缓冲通道,容量为2。

发送和接收

使用操作符 -> 进行发送和接收

ch <- 2    //发送数值2给这个通道
x: = <-ch  //从通道里读取值,并把读取的值赋值给x变量
<- ch      //从通道里读取值,然后忽略

关闭

当通道关闭时,就不能再往通道发送数据了,但是可以从通道接收数据。

close(ch)

通道缓冲

  1. 无缓冲通道
    无缓冲通道,如果发送和接收有一方还没有准备好的话,先执行的一方会阻塞直到另一方操作结束。无缓冲通道也称为同步通道
  2. 有缓冲通道
    有缓冲通道类似于队列。发送操作即向队列的尾部插入一条数据。接收操作类似删除队列头部数据,并返回删除的这条数据。

单向通道

var send chan<- int    //只能发送
var receive <-chan int //只能接收

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:冉小妹Ran

查看原文:【Golang】通道channel

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

521 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传