Golang Go语言中协程和select的知识点

发布于 1周前 作者 nodeper 来自 Go语言

Golang Go语言中协程和select的知识点

无缓存管道和缓存管道

先看看无缓存管道的例子:

	a := make(chan bool)
	go func() {
		log.Println("goroutine")
		<-a
	}()
	a <- true

这里主协程会等待子协程执行完,但是如果把第一行改成 a := make(chan bool, 1),那么主协程写完消息直接退出了,子协程没有机会执行(只有一个 cpu 时)。但是改成如下子协程又可以执行了:

	a := make(chan bool, 1)
	go func() {
		log.Println("goroutine")
		<-a
	}()
	a <- true
	a <- true

管道关闭后,select 能一直接受 close 信号

	a := make(chan bool, 1)
	go func() {
		close(a)
	}()
	for {
		select {
		case _, ok := <-a:
			log.Println(ok)
		}
	}

而用 for range 是不能获取 close 信号的,如下:

	a := make(chan bool, 1)
	go func() {
		a <- true
		close(a)
	}()
	for {
		for v := range a {
			log.Println(v)
		}
	}


更多关于Golang Go语言中协程和select的知识点的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

range 是循环到 chan 被关闭为止。当然如果一开始就是关闭的,循环就不执行。

更多关于Golang Go语言中协程和select的知识点的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,协程(goroutine)和select是并发编程的重要概念。以下是对这两个知识点的专业解读:

协程

协程是Go语言中的轻量级并发执行单元,允许在一个程序中同时执行多个函数。这些函数的执行相互独立且并发进行,创建成本很低,使得并发编程变得简单高效。使用go关键字即可启动一个新的协程,协程之间通过channel进行通信。

select

select语句用于监听多个channel的操作,它类似于switch语句,但专门用于处理channel的通信情况。select会阻塞直到其中一个分支可以执行,如果有多个分支都可以执行,会随机选择一个执行。其主要应用场景包括:

  1. 多通道选择:同时监听多个消息通道,并选择第一个可用的消息进行处理。
  2. 超时控制:结合time.After函数,实现对操作的超时控制。
  3. 任务取消:通过向特定channel发送取消信号,实现对任务的取消操作。

在使用select语句时,需要注意case的执行顺序是随机的,且每个case必须是一个对channel的可读或可写操作。此外,select语句必须在goroutine中使用,用于处理并发任务。

综上所述,协程和select是Go语言并发编程的两大核心组件,它们共同构成了Go语言强大的并发处理能力。

回到顶部