欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go语言select语句

程序员文章站 2024-03-23 11:01:28
...

go语言select语句

select会选择一个可运行的case(每个case都必须是一个通信)运行。

	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	select {
	case chan1 <- 1:
		fmt.Println("run chan1<-1")
	case <-chan2:
		fmt.Println("<-chan2")
	}
/*
输出:run chan1<-1
*/

若有多个可运行的case语句则随机执行一个。

	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	select {
	case chan1 <- 1:
		fmt.Println("run chan1<-1")
	case chan2 <- 2:
		fmt.Println("run chan2<-2")
	}
/*
随机输出run chan1<-1或run chan2<-2
*/

如果没有 case 可运行且没有default,它将阻塞,直到有 case 可运行。

func selectFun(chan1 chan int, chan2 chan int) {
	time.Sleep(time.Second)
	chan1 <- 1
}

func main() {
	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	go selectFun(chan1, chan2)
	select {
	case <-chan1:
		fmt.Println("run <-chan1")
	case <-chan2:
		fmt.Println("run <-chan2")
	default:
		fmt.Println("run default")
	}
}
/*
过一秒后输出: run <-chan1
*/

有default语句时运行default的内容

func selectFun(chan1 chan int, chan2 chan int) {
	time.Sleep(time.Second)
	chan1 <- 1
}

func main() {
	chan1, chan2 := make(chan int, 1), make(chan int, 1)
	go selectFun(chan1, chan2)
	select {
	case <-chan1:
		fmt.Println("run <-chan1")
	case <-chan2:
		fmt.Println("run <-chan2")
	default:
		fmt.Println("run default")
	}
}
/*
输出:run default
*/

相关标签: go go go语言