iT邦幫忙

0

[Golang]select 語句的分支選擇規則-心智圖總結

1. select語句的case表達式,都會在選擇之前,先被求值。

2. case表達式,求值的順序,會依照程式碼的編寫順序,從上而下。
而同一個case表達式中的求值順序,從左邊到右邊。

3. 當select語句中的所有case表達式都被求值完畢後,才會開始選擇case分支。
只會選擇滿足條件的case分支,如果所有的case分支都不滿足條件,就會選擇default分支。
如果沒有default分支,就會阻塞在select語句,直到至少有一個case分支滿足條件。

4. 如果select語句,發現同時有多個case分支滿足條件,Go語言會用隨機的算法,選擇符合條件的一個case分支。

package main

import "fmt"

var channels = [3]chan int{
	nil,
	make(chan int), //沒有buffer
	make(chan int, 1), //有buffer,可以放元素值
}

var numbers = []int{1, 2, 3}

func main() {
	select {
	//先對每一個case表達式求值,才選擇case分支
    case getChan(0) <- getNumber(0):
      fmt.Println("The first candidate case is selected.")

    case getChan(2) <- getNumber(2):
      fmt.Println("The third candidate case is selected")

    case getChan(1) <- getNumber(1):
      fmt.Println("The second candidate case is selected.")

    default:
      fmt.Println("No candidate case is selected!")
	}
}

func getNumber(i int) int {
	fmt.Printf("numbers[%d]\n", i)
	return numbers[i]
}

func getChan(i int) chan int {
	fmt.Printf("channels[%d]\n", i)
	return channels[i]
}

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

https://ithelp.ithome.com.tw/upload/images/20201103/20131728sY7jSOmEPl.png
參考來源:
郝林-Go语言核心36讲

https://github.com/hyper0x/Golang_Puzzlers


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

尚未有邦友留言

立即登入留言