Was wondering if execution order for struct initialization is guaranteed in GoLang.
Does the following code always produce
obj.a == 1
and obj.b == 2
or is it unspecified behavior?
num := 0
nextNumber := func() int {
num = 1
return num
}
type TwoNumbers struct {
a int
b int
}
obj := TwoNumbers{
a: nextNumber(),
b: nextNumber(),
}
CodePudding user response:
The evaluation order is specified.
The code TwoNumbers{a: nextNumber(), b: nextNumber()}
is a composite literal expression. The calls to nextNumber()
are operands in the expression.
The specification says this about expressions in general:
... when evaluating the operands of an expression, assignment, or return statement, all function calls, method calls, and communication operations are evaluated in lexical left-to-right order.
The operand for field a
is evaluated before the operand for field b
because the operand for field a
is to the left of the operand for field b
.