iT邦幫忙

0

[Golang]Channel的select語句-心智圖總結

  • 分享至 

  • xImage
  •  

1. channel的select語句
在Go語言,select只能和channel一起使用。
select語句的分支有兩種,一種為case分支,另一種為default分支。

2. select專為操作channel而存在的。每一個case表達式,只能包含操作channel的表達式

package main

import (
	"fmt"
	"math/rand"
)

func main() {
  //準備好幾個通道
  intChannels := [3]chan int{
    make(chan int, 1),
    make(chan int, 1),
    make(chan int, 1),
  }

  //隨機選擇一個通道,並向它發送元素值。
  index := rand.Intn(3)
  fmt.Printf("The index: %d\n", index)
  intChannels[index] <- index

  //哪一個通道中有可取的元素值,對應的分支就會被執行。
  select {
    case <-intChannels[0]:
      fmt.Println("The first candidate case is selected.")
    case <-intChannels[1]:
      fmt.Println("The second candidate case is selected.")
    case elem, ok := <-intChannels[2]:
      //檢查通道是否關閉
      if ok {
        fmt.Printf("The third candidate case is selected, the element is %d.\n", elem)
      }
    default:
      fmt.Println("No candidate case is selected!")
  }
}

https://play.golang.org/p/UfzHq28E5Rm

3. select 語句,要注意的事情
a. 如果沒有default分支,一旦所有的case表達式,都沒有滿足條件,就會阻塞在select語句,直到至少有一個case表達式滿足條件為止。
b. 有加入default分支,在沒有滿足case表達式時,會選擇default分支,select語句不會被阻塞。
c. 確認channel是否被關閉。 (如上面的範例)
d. select語句只能對其中的每一個case表達式各求值一次。(如需執行多次,需要通過for語句)

https://ithelp.ithome.com.tw/upload/images/20201103/20131728oNGjvs1m6R.png

參考來源:
郝林-Go语言核心36讲

https://github.com/hyper0x/Golang_Puzzlers


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言