表达式的评估顺序

6 go

我很好奇各种类型的表达式的顺序,所以我在顶级声明级别尝试了这个代码,认为它会失败,但发现它有效:

http://play.golang.org/p/CfP3DEC5LP

var x = func() *Foo {
    fmt.Println(f) // prints &{foobar}
    return f
}()

var f = &Foo{"foobar"}

type Foo struct {
    bar string
}
Run Code Online (Sandbox Code Playgroud)

请注意:

  • type Foo struct声明是在底部

  • type声明之前有var f声明和&Foo{]作业

  • var声明之前,有一个立即调用的函数,它引用并返回f变量.

尽管我&Foo{}type Foo struct声明之前发生了一个值,但我并没有太大的惊喜,但我确实惊讶于我可以f在分配之前成功引用并打印它.

这是一种可靠且明确的行为吗?我在规范中找不到任何对这种排序的引用,但也许我忽略了它.

Pau*_*kin 10

请参阅Go编程语言参考

在包中,初始化包级变量,并根据引用顺序确定常量值:如果A的初始化程序取决于B,则A将在B之后设置.依赖性分析不依赖于实际值.正在初始化的项目,仅限于它们在源中的外观.A取决于B,如果A的值包含B的提及,包含初始值提及B的值,或者提到递归提及B的函数.如果这种依赖性形成一个循环,那就是错误.如果两个项目不相互依赖,它们将按照它们在源中出现的顺序进行初始化,可能在多个文件中,如提供给编译器.由于每个包完成依赖性分析,如果A的初始化程序调用另一个引用B的包中定义的函数,它可以产生未指定的结果.