Go 表达式的求值顺序

Go 表达式的求值顺序,go,Go,我对一些不同类型的表达式的顺序很好奇,所以我在顶级声明级别尝试了这段代码,认为它会失败,但发现它可以工作: 请注意: 类型Foo-struct声明位于底部 在类型声明之前,有一个var f声明和&Foo{]赋值 在var声明之前,有一个立即调用的函数,它引用并返回f变量 虽然我可以生成一个&Foo{}值(即使它发生在类型Foo struct声明之前)并不让我感到惊讶,但我能够在赋值之前成功引用并打印f值确实让我感到惊讶 这是一种可靠且特定的行为吗?我在规范中找不到任何关于这种排序的参考,但

我对一些不同类型的表达式的顺序很好奇,所以我在顶级声明级别尝试了这段代码,认为它会失败,但发现它可以工作:

请注意:

  • 类型Foo-struct
    声明位于底部

  • 类型
    声明之前,有一个
    var f
    声明和
    &Foo{]
    赋值

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

虽然我可以生成一个
&Foo{}
值(即使它发生在
类型Foo struct
声明之前)并不让我感到惊讶,但我能够在赋值之前成功引用并打印
f
值确实让我感到惊讶

这是一种可靠且特定的行为吗?我在规范中找不到任何关于这种排序的参考,但可能我忽略了它。

请参见

在包中,初始化包级别的变量,并且 根据参考顺序确定常量值:如果 A的初始值设定项依赖于B,A将在B.Dependency之后设置 分析不取决于所分析项目的实际值 初始化,仅取决于它们在源中的外观。如果 A的值包含了B,包含了一个 初始值设定项提到B,或者提到一个提到B的函数, 递归。如果这种依赖关系形成一个循环,则是错误的。如果两个 项目不是相互依赖的,它们将按顺序初始化 它们出现在源代码中,可能出现在多个文件中,如呈现给 由于依赖关系分析是针对每个包进行的,因此 如果函数的初始值设定项调用函数,则会产生未指定的结果 在引用B的另一个包中定义


谢谢,我确实读过这篇文章,但我相信这是在谈论包依赖关系。问题是关于同一个包中代码的求值顺序。除非这是“…根据引用顺序…”的意思?…啊,是的,我想就是这样。我相信当我读到这一段时,我对这一段的主题感到困惑。这实际上为我澄清了一些更大的问题。由于包可以拆分为多个文件,我想知道将使用什么样的文件排序。这似乎表明排序是不相关的,因为variaBLE是按使用顺序初始化的…如果有意义的话。
var x = func() *Foo {
    fmt.Println(f) // prints &{foobar}
    return f
}()

var f = &Foo{"foobar"}

type Foo struct {
    bar string
}