GoLang Struct Initializer 的执行顺序

Pet*_*erM 4 go

想知道 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)

在操场上跑起来