Go语言结构体初始化的执行顺序

4

想知道在GoLang中,结构体初始化的执行顺序是否有保障。

以下代码是否总是会产生

obj.a == 1obj.b == 2 或者这是未指定的行为?

num := 0

nextNumber := func() int {
    num += 1
    return num
}

type TwoNumbers struct {
    a int
    b int
}

obj := TwoNumbers{
    a: nextNumber(),
    b: nextNumber(),
}
1个回答

10
函数调用的执行顺序已经指定。
代码TwoNumbers{a: nextNumber(), b: nextNumber()}是一个结构体字面量表达式。对于nextNumber()的调用是表达式中的操作数。 规范通常指出:在计算表达式、赋值或返回语句的操作数时,所有函数调用、方法调用和通信操作按照词法左到右的顺序进行评估。
字段a的函数调用在字段b的函数调用之前进行评估,这是因为字段a的函数调用位于字段b的函数调用的左侧。
仅针对函数调用、方法调用和通信操作指定了执行顺序。编译器可以重新排序其他操作数的求值顺序。在下面的示例中,字段a的表达式在词法上位于字段b的表达式左侧,但是在当前编译器中首先对b进行了评估。
type Numbers struct{ a, b, c int }
nums := Numbers{a: num, b: nextNumber(), c: nextNumber()}
fmt.Println(nums) // prints {2 1 2}

在 playground 上运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接