我最近经历了Golang"语言规范" https://golang.org/ref/spec#Order_of_evaluation但发现评估顺序与本文档中的说明不同。
例如,它说:
a := 1
f := func() int { a++; return a }
x := []int{a, f()} // x may be [1, 2] or [2, 2]: evaluation order between a and f() is not specified
然后我尝试了这段代码:
package main
import "fmt"
func main() {
for {
result := evaluate()
if result == 1 {
break
}
}
}
func evaluate() int {
a := 1
f := func() int { a++; return a }
x := []int{a, f()}
fmt.Println(x)
return x[0]
}
我发现切片x的值总是[2,2]。有什么我误解的吗?
提前致谢。
答案 0 :(得分:4)
订单'未指定'意味着它由编译器来决定,并且不能保证在编译器/其他编译器等/其他机器/其他时间等的不同版本上是相同的。
这并不意味着它每次都必须不同或崩溃(因为你可能习惯于C,其中'未定义的行为通常意味着坏事,例如在释放后使用指针存储器)