一. select简介

  • Golang中select和switch结构特别像,但是select中case的条件只能是I/O
  • select 的语法(condition是条件)

    1. select{
    2. case condition:
    3. case condition:
    4. default:
    5. }
  • select执行过程:

    • 每个case必须是一个IO操作
    • 哪个case可以执行就执行哪个
    • 多个case都可以执行,随机执行一个
    • 所有case都不能执行时,执行default
    • 所有case都不能执行,且没有default,将会阻塞
  • 代码示例

    1. func main() {
    2. runtime.GOMAXPROCS(1)
    3. ch1 := make(chan int, 1)
    4. ch2 := make(chan string, 1)
    5. ch1 <- 1
    6. ch2 <- "hello"
    7. select {
    8. case value := <-ch1:
    9. fmt.Println(value)
    10. case value := <-ch2:
    11. fmt.Println(value)
    12. }
    13. }
  • select多和for循环结合使用,下面例子演示出了一直在接收消息的例子 ```go package main

import ( “fmt” )

func main() { ch := make(chan int) for i := 1; i <= 5; i++ { go func(arg int) { ch <- arg }(i) } //如果是一直接受消息,应该是死循环for{},下面代码中是明确知道消息个数 for i := 1; i <= 5; i++ { select { case c := <-ch: fmt.Println(“取出数据”, c) default: //没有default会出现死锁 } } fmt.Println(“程序执行结束”) } ```

  • break可以对select生效,如果for中嵌套select,break选择最近结构