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