Golang 学习 - select

  • 作用:用来监听 channel 上的数据流动方向。( 读? 或 写?)

  • 用法:参考 switch case 语句语法。但是!case 后边必须是 IO 操作,不可以任意写判别表达式。

  • 注意事项:

    • 监听的 case 中,如果没有满足监听条件,则阻塞。
    • 监听的 case 中,如果有多个监听条件满足,则任选一个执行(因为需要争夺时间轮片)。
    • 可以使用 default 来处理所有 case 都不满足监听条件的状况。但通常不使用 default ,因为会产生忙轮询。
    • select 自身不带有循环机制,需要借助外层 for 循环来监听。
    • break 可以跳出 select 中的一个 case 选项。类似于 switch 中的用法。
  • select 超时处理
    select 监听 time.After() 中 channel 的读事件,如果定时时间到,系统会向读 channel 中写入系统当前时间。例如:

    func main()  {
    
    	ch := make(chan int)
    	quite := make(chan bool)
    
    	go func() {
    		for {
    			select {
    			case num := <-ch:
    				fmt.Println("num = ", num)
    			case <-time.After(time.Second * 3):
    				quite <- true
    				return
    			}
    		}
    	}()
    
    	for i := 0; i < 2; i++ {
    		ch<- i
    		time.Sleep(time.Second * 2)
    	}
    
    	<-quite
    	fmt.Println("finish!")
    }
    

你可能感兴趣的:(Golang,go,golang)