Go语言精进之路读书笔记第17条——理解Go语言表达式的求值顺序
Go语言表达式
- 支持在同一行声明和初始化多个变量
- 支持在同一行对多个变量进行赋值(不同类型也可以)
var a, b, c = 5, "hello", 3.45
a, b, c := 5, "hello", 3.45
a, b, c = 5, " hello", 3.45
Rob Pike 练习题(规则见17.3 赋值语句的求值)
n0, n1 = n0+n1, n0
或者
n0, n1 = op(n0, n1), n0
17.1 包级别变量声明语句中的表达式求值顺序
- 包级别变量按照声明的先后顺序进行初始化
- 如果某个变量直接或间接依赖其他变量,那么初始化顺序排在依赖的变量后面
- 未初始化且不含对应初始化表达式或初始化表达式不依赖任何初始化变量的变量,称之为"ready for initialization"变量
- 逐步初始化"ready for initialization"变量
- 先处理的文件中的变量顺序在前
- 特殊情况:
- 空变量(_)一视同仁
- 多个变量在声明语句左侧且右侧为单一表达式时,无论左侧那个变量被初始化,同一行的其他变量也会被一并初始化
17.2 普通求值顺序
普通求值顺序(usual order):Go规定表达式操作数中的所有函数、方法以及channel操作按照从左到右的次序进行求值
特殊情况2,右侧非单一表达式的情况下,需要将声明语句等价转换
17.3 赋值语句的求值
赋值语句求值分为两个阶段:
- 第一阶段,对于等号左边的下标表达式、指针解引用表达式和等号右边表达式中的操作数,按照普通求值规则从左到右进行求值;
- 第二阶段,按从左到右的顺序对变量进行赋值。
17.4 switch/select语句中的表达式求值
switch-case/select-case语句中的表达式求值属于"惰性求值"范畴。惰性求值指的是需要进行求值时才会对表达式进行求值。
- switch-case例子中,Expre(3)和Expre(4)被略过
- select-case例子中,首先所有case表达式都会被按出现的先后顺序求值一遍,除了位于case等号左边的从channel接收数据的case,该case等号左边的表达式在接收前才会被求值。