Go語言 之select


package main

import (
    "fmt"
)

func fibonacci(c, quit chan int) {
    x, y := 1, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)

    go func() {
        for i := 0; i < 6; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()

    fibonacci(c, quit)
}

Go里面提供了一個關鍵字select,通過select可以監聽channel上的數據流動。

select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇條件由case語句來描述。

與switch語句相比, select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作,大致的結構如下:

    select {

      case <-chan1:

        // 如果chan1成功讀到數據,則進行該case處理語句

      case chan2 <- 1:

        // 如果成功向chan2寫入數據,則進行該case處理語句

      default:

        // 如果上面都沒有成功,則進入default處理流程

    }

在一個select語句中,Go語言會按順序從頭至尾評估每一個發送和接收的語句。

如果其中的任意一語句可以繼續執行(即沒有被阻塞),那么就從那些可以執行的語句中任意選擇一條來使用。

如果沒有任意一條語句可以執行(即所有的通道都被阻塞),那么有兩種可能的情況:

l 如果給出了default語句,那么就會執行default語句,同時程序的執行會從select語句后的語句中恢復。

l 如果沒有default語句,那么select語句將被阻塞,直到至少有一個通信可以進行下去。


免責聲明!

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



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