我很好奇一些各种类型的表达式的顺序,所以我在顶层声明层尝试了这段代码,认为它会失败,但发现它可以工作:
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
}
请注意:
声明在
type Foo struct
底部在
type
声明之前有一个var f
声明和&Foo{]
赋值在
var
声明之前,有一个立即调用的函数,它引用并返回f
变量。
&Foo{}
尽管即使它发生在声明之前,我也可以创建一个值并没有让我感到太惊讶,但令我感到惊讶的是,我可以在赋值之前type Foo struct
成功引用并打印该值。f
这是一种可靠且特定的行为吗?我在规范中找不到对这种排序的任何引用,但也许我忽略了它。