68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
// Test of initialization order of package-level vars.
|
|
|
|
var counter int
|
|
|
|
func next() int {
|
|
c := counter
|
|
counter++
|
|
return c
|
|
}
|
|
|
|
func next2() (x int, y int) {
|
|
x = next()
|
|
y = next()
|
|
return
|
|
}
|
|
|
|
func makeOrder() int {
|
|
_, _, _, _ = f, b, d, e
|
|
return 0
|
|
}
|
|
|
|
func main() {
|
|
// Initialization constraints:
|
|
// - {f,b,c/d,e} < order (ref graph traversal)
|
|
// - order < {a} (lexical order)
|
|
// - b < c/d < e < f (lexical order)
|
|
// Solution: a b c/d e f
|
|
abcdef := [6]int{a, b, c, d, e, f}
|
|
if abcdef != [6]int{0, 1, 2, 3, 4, 5} {
|
|
panic(abcdef)
|
|
}
|
|
}
|
|
|
|
var order = makeOrder()
|
|
|
|
var a, b = next(), next()
|
|
var c, d = next2()
|
|
var e, f = next(), next()
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
var order2 []string
|
|
|
|
func create(x int, name string) int {
|
|
order2 = append(order2, name)
|
|
return x
|
|
}
|
|
|
|
var C = create(B+1, "C")
|
|
var A, B = create(1, "A"), create(2, "B")
|
|
|
|
// Initialization order of package-level value specs.
|
|
func init() {
|
|
x := fmt.Sprint(order2)
|
|
// Result varies by toolchain. This is a spec bug.
|
|
if x != "[B C A]" && // gc
|
|
x != "[A B C]" { // go/types
|
|
panic(x)
|
|
}
|
|
if C != 3 {
|
|
panic(c)
|
|
}
|
|
}
|