Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 1 | // $G $F.go && $L $F.$A && ./$A.out |
| 2 | |
| 3 | // Copyright 2009 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | package main |
| 8 | |
Russ Cox | 918afd94 | 2009-05-08 15:21:41 -0700 | [diff] [blame] | 9 | import "os" |
| 10 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 11 | const ( |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 12 | Bool = iota |
| 13 | Int |
| 14 | Float |
| 15 | String |
| 16 | Struct |
| 17 | Chan |
| 18 | Array |
| 19 | Map |
| 20 | Func |
| 21 | Last |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 22 | ) |
| 23 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 24 | type S struct { |
| 25 | a int |
| 26 | } |
| 27 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 28 | var s S = S{1234} |
| 29 | |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 30 | var c = make(chan int) |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 31 | |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 32 | var a = []int{0, 1, 2, 3} |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 33 | |
| 34 | var m = make(map[string]int) |
| 35 | |
| 36 | func assert(b bool, s string) { |
| 37 | if !b { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 38 | println(s) |
| 39 | os.Exit(1) |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 40 | } |
| 41 | } |
| 42 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 43 | func f(i int) interface{} { |
| 44 | switch i { |
| 45 | case Bool: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 46 | return true |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 47 | case Int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 48 | return 7 |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 49 | case Float: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 50 | return 7.4 |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 51 | case String: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 52 | return "hello" |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 53 | case Struct: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 54 | return s |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 55 | case Chan: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 56 | return c |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 57 | case Array: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 58 | return a |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 59 | case Map: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 60 | return m |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 61 | case Func: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 62 | return f |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 63 | } |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 64 | panic("bad type number") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 65 | } |
| 66 | |
| 67 | func main() { |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 68 | for i := Bool; i < Last; i++ { |
| 69 | switch x := f(i).(type) { |
| 70 | case bool: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 71 | assert(x == true && i == Bool, "bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 72 | case int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 73 | assert(x == 7 && i == Int, "int") |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 74 | case float64: |
| 75 | assert(x == 7.4 && i == Float, "float64") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 76 | case string: |
Russ Cox | f2b5a07 | 2011-01-19 23:09:00 -0500 | [diff] [blame] | 77 | assert(x == "hello" && i == String, "string") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 78 | case S: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 79 | assert(x.a == 1234 && i == Struct, "struct") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 80 | case chan int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 81 | assert(x == c && i == Chan, "chan") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 82 | case []int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 83 | assert(x[3] == 3 && i == Array, "array") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 84 | case map[string]int: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 85 | assert(x == m && i == Map, "map") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 86 | case func(i int) interface{}: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 87 | assert(x == f && i == Func, "fun") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 88 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 89 | assert(false, "unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 90 | } |
| 91 | } |
| 92 | |
Rob Pike | 08eeb25 | 2009-03-18 14:05:05 -0700 | [diff] [blame] | 93 | // boolean switch (has had bugs in past; worth writing down) |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 94 | switch { |
| 95 | case true: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 96 | assert(true, "switch 2 bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 97 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 98 | assert(false, "switch 2 unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 99 | } |
| 100 | |
| 101 | switch true { |
| 102 | case true: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 103 | assert(true, "switch 3 bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 104 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 105 | assert(false, "switch 3 unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | switch false { |
| 109 | case false: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 110 | assert(true, "switch 4 bool") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 111 | default: |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 112 | assert(false, "switch 4 unknown") |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 113 | } |
| 114 | |
Rob Pike | bcb464d | 2009-03-17 20:55:42 -0700 | [diff] [blame] | 115 | } |