select

摘抄至原文

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

LW放下的博客
请先登录后发表评论
  • latest comments
  • 总共0条评论