Golang评估顺序

时间:2015-12-11 20:36:00

标签: go

我最近经历了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]。有什么我误解的吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

订单'未指定'意味着它由编译器来决定,并且不能保证在编译器/其他编译器等/其他机器/其他时间等的不同版本上是相同的。

这并不意味着它每次都必须不同或崩溃(因为你可能习惯于C,其中'未定义的行为通常意味着坏事,例如在释放后使用指针存储器)