Goroutine 是 Go 运行时管理的轻量级线程
主线程结束时,协程会被中断,需要有效的阻塞机制
数据竞争
多个线程同时对同一个内存空间进行写操作会导致数据竞争
sync包可以解决此问题,互斥锁Mutex,但在 Go 中不常用
因为go中有更高效的信道channel来解决这个问题
5.4.1 声明与存取
channel,官方翻译为信道,是一种带有类型的管道
引用类型,使用前需要make(Type, (缓冲区容量))
不带缓冲区的管道必须结合结合协程使用
可以查看长度len(channel)或容量cap(channel)
存入: channel <- value
取出: value, (ok) <- channel
丢弃: <- channel
先进先出,自动阻塞
数据需要保持流动,否则会阻死报错
5.4.2 关闭
可以通过close(信道),来表示没有需要放入的值了
5.4.3 for 或 for…range
不断从信道接收值,直到它被关闭(缺乏关闭机制会报错)
5.4.4 select…case
适用于无法确认合适关闭信道的情况
通常结合for循环使用
select…case 会阻塞到某个分支可以继续执行时执行该分支,当没有可执行的分支时则执行 default 分支