Select用法


Select用法

Go里面提供了一個關鍵字select,通過select可以監聽channel上的數據流動。
select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇條件由case語句來描述。
與switch語句相比, select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作,大致的結構如下

select {
    case <-chan1:
        // 如果chan1成功讀到數據,則進行該case處理語句
    case chan2 <- 1:
        // 如果成功向chan2寫入數據,則進行該case處理語句
    default:
        // 如果上面都沒有成功,則進入default處理流程
}

普通的代碼

package main

import (
	"fmt"
	"time"
)

func WorkHere(quit chan interface{}) {
	for {
		select {
		case <-quit:
			fmt.Println("over")
			return
		default:
			time.Sleep(time.Millisecond * 100)
			fmt.Println("work")
		}
	}
}

func main() {
	var (
		quit chan interface{}
	)
	quit = make(chan interface{})
	go WorkHere(quit)
	time.Sleep(2 * time.Second)
	quit<- "quit"
}

# 輸出
work
work
..........此處省略一萬字
work
work
over

小結

用法: 參考 switch case 語句。 但!case后面必須是IO操作,不可以任意寫判別表達式。

注意事項:
    1. 監聽的case中,沒有滿足監聽條件,阻塞。

    2. 監聽的case中,有多個滿足監聽條件,任選一個執行。

    3. 可以使用default來處理所有case都不滿足監聽條件的狀況。 通常不用(會產生忙輪詢)

    4. select 自身不帶有循環機制,需借助外層 for 來循環監聽

    5. break 跳出 select中的一個case選項 。類似於switch中的用法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM