想知道 GoLang 中是否保证结构初始化的执行顺序。
以下代码是否总是产生
obj.a == 1或者obj.b == 2这是未指定的行为?
num := 0
nextNumber := func() int {
num += 1
return num
}
type TwoNumbers struct {
a int
b int
}
obj := TwoNumbers{
a: nextNumber(),
b: nextNumber(),
}
Run Code Online (Sandbox Code Playgroud)
Cer*_*món 10
函数调用的评估顺序是指定的。
该代码TwoNumbers{a: nextNumber(), b: nextNumber()}是一个复合文字表达式。对的调用nextNumber()是表达式中的操作数。
规范对于一般表达式是这样说的:
...在计算表达式、赋值或 return 语句的操作数时,所有函数调用、方法调用和通信操作均按词法从左到右的顺序进行计算。
对 field 的函数调用a在对 field 的函数调用之前进行评估b,因为对 field 的函数调用a位于对 field 的函数调用的左侧b。
评估顺序仅针对函数调用、方法调用和通信操作指定。编译器可以重新排序其他操作数的计算。在以下示例中, field 表达式在a词法上位于 field 表达式左侧b,但b首先进行计算(在当前编译器中)。
type Numbers struct{ a, b, c int }
nums := Numbers{a: num, b: nextNumber(), c: nextNumber()}
fmt.Println(nums) // prints {2 1 2}
Run Code Online (Sandbox Code Playgroud)