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