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
}