// run // 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. // Test simple type switches, including chans, maps etc. package main import "os" 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) os.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 float64: assert(x == 7.4 && i == Float, "float64") 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 != nil && i == Map, "map") case func(i int) interface{}: assert(x != nil && 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") } }