【Golang】通道channel

2020-03-23  本文已影响0人  冉小妹Ran

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 //只能接收
上一篇 下一篇

猜你喜欢

热点阅读