QUICK FIND

搜索站点内容

输入关键词开始搜索,无需连接服务器。

⌘ K 随时打开,按 Esc 关闭

select

通过 select 可以监听 channel 上的数据流动。

摘抄至原文

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

Conversation

讨论这篇内容

评论由 GitHub Discussions 提供 · 打开讨论仓库