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) } }