package main // Test of initialization order of package-level vars. type T int var counter int func next() int { c := counter counter++ return c } func (T) next() int { return next() } var t T func makeOrder1() [6]int { return [6]int{f1, b1, d1, e1, c1, a1} } func makeOrder2() [6]int { return [6]int{f2, b2, d2, e2, c2, a2} } var order1 = makeOrder1() func main() { // order1 is a package-level variable: // [a-f]1 are initialized is reference order. if order1 != [6]int{0, 1, 2, 3, 4, 5} { panic(order1) } // order2 is a local variable: // [a-f]2 are initialized in lexical order. var order2 = makeOrder2() if order2 != [6]int{11, 7, 9, 10, 8, 6} { panic(order2) } } // The references traversal visits through calls to package-level // functions (next), method expressions (T.next) and methods (t.next). var a1, b1 = next(), next() var c1, d1 = T.next(0), T.next(0) var e1, f1 = t.next(), t.next() var a2, b2 = next(), next() var c2, d2 = T.next(0), T.next(0) var e2, f2 = t.next(), t.next()