select

2022-02-22 15:17:24

摘抄至原文

select 默认是阻塞的,只有当监听的 channel 中有发送或接收可以进行时才会运行,当多个 channel 都准备好的时候,select 是随机的选择一个执行的。

监听触发执行

package main

import (
	"fmt"
	"time"
)

func main() {
	a := make(chan int)
	b := make(chan int)
	fun := func() {
		select {
		case <-a:
			fmt.Println("aa")
		case <-b:
			fmt.Println("bb")
		}
	}

	go func() {
		time.Sleep(2 * time.Second)
		a<-1
	}()

	go func() {
		time.Sleep(1 * time.Second)
		b<-1
	}()

	fun()

	fun()

}

以上程序始终输出

image.png

监听随机执行

package main

import (
	"fmt"
	"time"
)

func main() {
	a := make(chan int)
	b := make(chan int)
	fun := func() {
		select {
		case <-a:
			fmt.Println("aa")
		case <-b:
			fmt.Println("bb")
		}
	}

	go func() {
		time.Sleep(1 * time.Second)
		a<-1
	}()

	go func() {
		time.Sleep(1 * time.Second)
		b<-1
	}()

	fun()

	fun()

}

以上程序始终输出

image.png

本文由"putyy"原创,转载无需和我联系,但请注明来自putyy
您的浏览器不支持canvas标签,请您更换浏览器