# 通道的基本操作

## 0.资料

1. https://gfw.go101.org/article/channel.html
2. https://www.cnblogs.com/liang1101/p/7285955.html
3. https://www.cnblogs.com/sparkdev/p/10930168.html

## 1. 特性

1. 对于同一个通道，发送操作之间是互斥的，接收操作之间也是互斥的。（入和出的互斥性）
2. 发送操作和接收操作中对元素值的处理都是不可分割的。（入和出的原子性）
3. 发送操作在完全完成之前会被阻塞。接收操作也是如此。

### 说明

1. 通道类型值，本身是并发安全的
2. 并发执行，是多个代码块分别在不同的 goroutine 之中，并有机会在同一个时间段内被执行。（并发不是同时执行）
3. 通道分缓冲通道和非缓冲通道

## 2. panic

1. 向已经关闭的channel写。
2. 关闭已经关闭的channel。

## 3.阻塞

![image-20220628235019239](read.assets/image-20220628235019239.png)

1. 什么是阻塞，我的理解就是，这个步骤（接受或者发送）执行不了，停在这了，只有当其对应的（发送或者接受）唤醒，才能解除当前阻塞
2. 无论是读或者写，第一步都是先获取当前通道的锁。
3. 一般在生产者处关闭通道，在消费者处关闭容易引发恐慌
   ![image-20220704230837390](read.assets/image-20220704230837390.png)

# 2. 协程（gorountine）

1. 进程、线程（内核级线程）、协程（用户级线程）三个概念
2. 进程、线程由内核调度，有CPU时间片的概念，有多种调度算法
3. 协程（用户级线程）对内核透明，即系统不知道有协程的存在，是完全由用户自己的程序进行调度控制的。
4. https://learnku.com/articles/41405

![image-20220628225339441](read.assets/image-20220628225339441.png)

**Go 协程（goroutine）通过信道（channel）进行通信**。信道可以防止多个协程访问共享内存时发生资源争抢的问题。