# 通道的基本操作 ## 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)进行通信**。信道可以防止多个协程访问共享内存时发生资源争抢的问题。