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)

注意:

  1. 通道是阻塞式的,协程从中读取/写入数据,除非通道中存在数据/缓冲区未满,否则对该通道进行IO操作的协程阻塞
  2. 无缓冲区通道可认为是有一个单位容量的带缓冲区通道
  3. 只读/只写通道多数时候用于函数传参,控制通道的读写,例如
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)
	}
  1. 通道是协程安全的,内部互斥锁保证同一时刻只有一个协程对通道进行操作

select语句

  • 用法
select {
	case 通道IO操作语句:	...	
	case 通道IO操作语句:	...	
	default:...
	}

注意:select和switch语句类似,但case后接chan的IO语句,程序选择一个IO语句非阻塞的case分支执行,若都阻塞则转default分支