【注意】最后更新于 March 2, 2023,文中内容可能已过时,请谨慎使用。
1.什么是select?
select
语句的机制有点像switch
语句,不同的是,select
会随机挑选一个可通信的case
来执行,如果所有case
都没有数据到达,则执行default
,如果没有default
语句,select
就会阻塞,直到有case
接收到数据。
2. select使用(没有default)
如果没有default
语句时,select
就会阻塞,直到有case
接收到数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package main
import (
"fmt"
"strconv"
)
func main() {
// 创建通道
intChan := make(chan int)
stringChan := make(chan string)
// 写入
go func() {
for i := 1; i < 4; i++ {
intChan <- i
stringChan <- "张xx-" + strconv.Itoa(i)
}
}()
// 使用select 没有default,则会阻塞等待。(会随机运行一次)
select {
case n := <-intChan:
fmt.Printf("接收到intChan中的数据: %v\n", n)
case s := <-stringChan:
fmt.Printf("接收到stringChan中的数据: %v\n", s)
}
fmt.Printf("运行结束!")
}
/** 输出:
接收到intChan中的数据: 1
运行结束!
*/
|
3.select使用(有default)
如果有default
时,所有case
都没有数据到达,则执行default
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package main
import (
"fmt"
"strconv"
)
func main() {
// 创建通道
intChan := make(chan int)
stringChan := make(chan string)
// 写入
go func() {
for i := 1; i < 4; i++ {
intChan <- i
stringChan <- "张xx-" + strconv.Itoa(i)
}
}()
// 使用select 没有default,则会阻塞等待。(会随机运行一次)
select {
case n := <-intChan:
fmt.Printf("接收到intChan中的数据: %v\n", n)
case s := <-stringChan:
fmt.Printf("接收到stringChan中的数据: %v\n", s)
default:
fmt.Println("什么数据都没收到!")
}
fmt.Printf("运行结束!")
}
/** 输出:
什么数据都没收到!
运行结束!
*/
|