// $G $F.go && $L $F.$A && ./$A.out // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main const ( Bool = iota; Int; Float; String; Struct; Chan; Array; Map; Func; Last; ) type S struct { a int } var s S = S{1234} var c = make(chan int); var a = []int{0,1,2,3} var m = make(map[string]int) func assert(b bool, s string) { if !b { println(s); sys.Exit(1); } } func f(i int) interface{} { switch i { case Bool: return true; case Int: return 7; case Float: return 7.4; case String: return "hello"; case Struct: return s; case Chan: return c; case Array: return a; case Map: return m; case Func: return f; } panic("bad type number"); } func main() { for i := Bool; i < Last; i++ { switch x := f(i).(type) { case bool: assert(x == true && i == Bool, "bool"); case int: assert(x == 7 && i == Int, "int"); case float: assert(x == 7.4 && i == Float, "float"); case string: assert(x == "hello"&& i == String, "string"); case S: assert(x.a == 1234 && i == Struct, "struct"); case chan int: assert(x == c && i == Chan, "chan"); case []int: assert(x[3] == 3 && i == Array, "array"); case map[string]int: assert(x == m && i == Map, "map"); case func(i int) interface{}: assert(x == f && i == Func, "fun"); default: assert(false, "unknown"); } } // boolean switch (has had bugs in past; worth writing down) switch { case true: assert(true, "switch 2 bool"); default: assert(false, "switch 2 unknown"); } switch true { case true: assert(true, "switch 3 bool"); default: assert(false, "switch 3 unknown"); } switch false { case false: assert(true, "switch 4 bool"); default: assert(false, "switch 4 unknown"); } }