Go_select

select 是 Go 中的一个控制结构。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。

select语句的语法结构和switch语句很相似,也有case语句和default语句:

 select {
     case communication clause  :
        statement(s);      
     case communication clause  :
        statement(s); 
     /* 你可以定义任意数量的 case */
     default : /* 可选 */
        statement(s);
 }

说明:

  • 每个case都必须是一个通信

  • 所有channel表达式都会被求值

  • 所有被发送的表达式都会被求值

  • 如果有多个case都可以运行,select会随机公平地选出一个执行。其他不会执行。

  • 否则:

    如果有default子句,则执行该语句。

    如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。

package main

import (
	"fmt"
	"time"
)

func main() {
	/*
	分支语句:if,switch,select
	select语句类型于switch语句
		但是select语句会随机执行一个可运行的case
		如果没有case可以运行,要看是否有default,如果有就执行default,否则就进入阻塞,直到有case可以运行
	 */
	ch1 := make(chan int)
	ch2 := make(chan int)

	go func() {
		time.Sleep(3 * time.Second)
		ch1 <- 100
	}()

	go func() {
		time.Sleep(3 * time.Second)
		ch2 <- 200
	}()

	select {
	case num1 := <-ch1:
		fmt.Println("ch1中获取的数据。。", num1)
	case num2, ok := <-ch2:
		if ok {
			fmt.Println("ch2中读取的数据。。", num2)
		} else {
			fmt.Println("ch2通道已经关闭。。")
		}

	default:
		fmt.Println("default语句。。。")
	}

	fmt.Println("main..over...")
}

 

原文地址:https://www.cnblogs.com/yzg-14/p/12254567.html