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 分支