GO语言快速入门
- 协程并发go关键字
- 协程间通信-通道chan
- select语句
- Go语言快速入门笔记系列传送门
协程并发go关键字
- 协程是什么
协程,又称微线程,纤程。英文名Coroutine。相比于线程(8M左右),协程(4K左右)占用的空间很小,同时并发协程数可以没有上限(只要内存足够),而并发线程数受制于操作系统,因此协程更适合高并发环境。 - 开启协程
go fun() //fun为需要协程启动的函数
- 设置并发调用的逻辑CPU核心数
func init(){
//设置程序最大可用CPU数量为机器的最大逻辑核心数
runtime.GOMAXPROCS(runtime.NumCPU())
}
注意:init函数和main函数相同,在main函数被调用前执行
协程间通信-通道chan
- chan声明
chl := make(chan datetype) //无缓冲区通道
chl := make(chan datetype, 缓冲区长度) //带缓冲区通道
chl := make(<- chan datetype[, 缓冲区长度]) //只读通道
chl := make(chan <- datetype[, 缓冲区长度]) //只写通道
- 向通道写入数据
chl <- 数据
- 从通道中读取数据并保存在变量中
方法1:变量 := <- chl
方法2:变量,ok := <- chl //ok表示通道是否关闭
方法3:for value := range chl{ //for-range读取数据,直到通道关闭
//循环操作
}
- 通道的关闭
close(chl)
注意:
- 通道是阻塞式的,协程从中读取/写入数据,除非通道中存在数据/缓冲区未满,否则对该通道进行IO操作的协程阻塞
- 无缓冲区通道可认为是有一个单位容量的带缓冲区通道
- 只读/只写通道多数时候用于函数传参,控制通道的读写,例如
func read(chl <- chan string){
<- chl
}
func write(chl chan <- string, data string){
chl <- data
}
func main{
chl := make(chan string, 10)
write(chl, "hello")
read(chl)
}
- 通道是协程安全的,内部互斥锁保证同一时刻只有一个协程对通道进行操作
select语句
- 用法
select {
case 通道IO操作语句: ...
case 通道IO操作语句: ...
default:...
}
注意:select和switch语句类似,但case后接chan的IO语句,程序选择一个IO语句非阻塞的case分支执行,若都阻塞则转default分支