猿问

切片文字中的求值顺序

我最近浏览了 Go 的“语言规范” 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]。我有什么误解吗?


弑天下
浏览 127回答 1
1回答

慕容森

“未指定”命令意味着由编译器决定,并且不能保证在不同版本的编译器/其他编译器等/其他机器/一天中的其他时间等上是相同的。这并不意味着每次或崩溃时它都必须不同(正如您可能习惯于从 C 中看到的那样,其中“未定义行为”通常意味着一些不好的事情,例如在释放内存后使用指针)
随时随地看视频慕课网APP

相关分类

Go
我要回答