深入理解go语言channel

               channel 是 Go 语言中的一个非常重要的特性,这篇文章来深入了解一下 channel。

 

1. CSP

        要想理解 channel 要先知道 CSP 模型。CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。CSP 模型的关键是关注 channel,而不关注发送消息的实体。Go 语言实现了 CSP 部分理论,goroutine 对应 CSP 中并发执行的实体,channel 也就对应着 CSP 中的 channel。

 

2. channel 基础知识

 

2.1 创建 channel

channel 使用之前需要通过 make 创建。

unBufferChan := make(chan int)  // 1
bufferChan := make(chan int, N) // 2

 

       上面的方式 1 创建的是无缓冲 channel,方式 2 创建的是缓冲 channel。如果使用 channel 之前没有 make,会出现 dead lock 错误。

func main() {
    var x chan intgo func() {
        x <- 1
    }()
    <-x
}

 

$ go run channel1.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive (nil chan)]:
main.main()
    /Users/kltao/code/go/examples/channl/channel1.go:11 +0x60

goroutine 4 [chan send (nil chan)]:
main.main.func1(0x0)

 

2.2 channel 读写操作

ch := make(chan int, 10)

// 读操作
x <- ch

// 写操作
ch <- x

2.3 channel 种类

channel 分为无缓冲 channel 和有缓冲 channel。两者的区别如下:

  • 无缓冲:发送和接收动作是同时发生的。如果没有 goroutine 读取 channel (<- channel),则发送者 (channel <-) 会一直阻塞。
  • 缓冲:缓冲 channel 类似一个有容量的队列。当队列满的时候发送者会阻塞;当队列空的时候接收者会阻塞。

 

2.4 关闭 channel

channel 可以通过 built-in 函数 close() 来关闭。

ch := make(chan int)

// 关闭
close(ch)

关于关闭 channel 有几点需要注意的是:

  • 重复关闭 channel 会导致 panic。
  • 向关闭的 channel 发送数据会 panic。
  • 从关闭的 channel 读数据不会 panic,读出 channel 中已有的数据之后再读就是 channel 类似的默认值,比如 chan int 类型的 channel 关闭之后读取到的值为 0。

 

         对于上面的第三点,我们需要区分一下:channel 中的值

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值