Go语言select case语句的用法
在Go语言中,除了 switch case 语句外,还有一种选择结构——select case。select 语句可以用于配合通道(channel)的读/写操作,用于多个 channel 的并发读/写操作。
select 语句类似于 switch 语句,switch 语句是按照顺序从上到下依次执行,而 select 是随机选择一个 case 执行。如果没有 case 可运行,它将阻塞,直到有 case 可运行。
Go语言 select case 语句的语法格式如下:
请看下面的代码:
第0次,from b
第1次,from a
第2次,from b
第3次,from b
第4次,from a
第5次,from b
第6次,from b
第7次,from b
第8次,from b
第9次,from b
在以上代码中,同时在 a 和 b 中进行选择,哪个有内容就从哪个读,由于 channel 的读/写操作是阻塞操作,使用 select 语句可以避免单个 channel 的阻塞。
此外,select 同样可以使用 default 代码块,避免所有 channel 同时阻塞。
	
	
select 语句类似于 switch 语句,switch 语句是按照顺序从上到下依次执行,而 select 是随机选择一个 case 执行。如果没有 case 可运行,它将阻塞,直到有 case 可运行。
Go语言 select case 语句的语法格式如下:
select {
    case:
        代码块1;
    case:
        代码块2;
    /*可以定义任意数量的 case*/
    default : /*可选*/
        代码块n;
}
在 select case 语句中:
- 每个 case 都必须是一个通信。
 - 所有 channel 表达式都会被求值。
 - 所有被发送的表达式都会被求值。
 - 如果任意某个通信可以进行,它就执行,其他被忽略。
 - 如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行。
 - 
		否则:
		
- 如果有 default 子句,则执行该语句。
 - 如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go不会重新对 channel 或值进行求值。
 
 
请看下面的代码:
package main
import "fmt"
func main() {
    a := make(chan int, 1024)
    b := make(chan int, 1024)
    for i := 0; i < 10; i++ {
        fmt.Printf("第%d次,", i)
        a <- 1
        b <- 1
        select {
        case <-a:
            fmt.Println("from a")
        case <-b:
            fmt.Println("from b")
        }
    }
}
运行结果(每次返回的结果都是不同的):第0次,from b
第1次,from a
第2次,from b
第3次,from b
第4次,from a
第5次,from b
第6次,from b
第7次,from b
第8次,from b
第9次,from b
在以上代码中,同时在 a 和 b 中进行选择,哪个有内容就从哪个读,由于 channel 的读/写操作是阻塞操作,使用 select 语句可以避免单个 channel 的阻塞。
此外,select 同样可以使用 default 代码块,避免所有 channel 同时阻塞。
 ICP备案:
 公安联网备案: