[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


<<:  JS 执行绪与同步 非同步 DAY50

>>:  工作散记 - 在本机开发环境建置MSW

Day01 iPhone捷径是啥

原本是想说要来写资安事件处理流程, 但要串的东西实在太多了, 又加上怕准备的资料不够齐全所以就放弃这...

学习日记-2

有一小段时间没跟新了XD! 主要是平时都加班,下班去健身房回到家,就只剩1-2小时的学习时间,就慢慢...

[Day5] MacOS - 打造美观的终端机画面

程序开发的过程很难不接触到终端机操作,原生的画面非常"简约",透过套件强化後不只...

[30天 Vue学好学满 DAY4] Vue-cli 基本架构

Vue-cli 专案基本架构 favicon.ico:仅用於 index.html index.ht...

[30天 Vue学好学满 DAY15] prop & emit-2

emit 监听子组件 父组件: 透过v-on监听子组件事件 子组件: 透过$emit传递事件名称 直...