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