blob: 83fb0985a91e1a9eaf00b21c9df9c149ee9540de [file] [log] [blame]
Rob Pikebcb464d2009-03-17 20:55:42 -07001// $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
7package main
8
Russ Cox918afd942009-05-08 15:21:41 -07009import "os"
10
Rob Pikebcb464d2009-03-17 20:55:42 -070011const (
Rob Pike4f61fc92010-09-04 10:36:13 +100012 Bool = iota
13 Int
14 Float
15 String
16 Struct
17 Chan
18 Array
19 Map
20 Func
21 Last
Rob Pikebcb464d2009-03-17 20:55:42 -070022)
23
Russ Coxf2b5a072011-01-19 23:09:00 -050024type S struct {
25 a int
26}
27
Rob Pikebcb464d2009-03-17 20:55:42 -070028var s S = S{1234}
29
Rob Pike4f61fc92010-09-04 10:36:13 +100030var c = make(chan int)
Rob Pikebcb464d2009-03-17 20:55:42 -070031
Russ Coxf2b5a072011-01-19 23:09:00 -050032var a = []int{0, 1, 2, 3}
Rob Pikebcb464d2009-03-17 20:55:42 -070033
34var m = make(map[string]int)
35
36func assert(b bool, s string) {
37 if !b {
Rob Pike4f61fc92010-09-04 10:36:13 +100038 println(s)
39 os.Exit(1)
Rob Pikebcb464d2009-03-17 20:55:42 -070040 }
41}
42
Rob Pikebcb464d2009-03-17 20:55:42 -070043func f(i int) interface{} {
44 switch i {
45 case Bool:
Rob Pike4f61fc92010-09-04 10:36:13 +100046 return true
Rob Pikebcb464d2009-03-17 20:55:42 -070047 case Int:
Rob Pike4f61fc92010-09-04 10:36:13 +100048 return 7
Rob Pikebcb464d2009-03-17 20:55:42 -070049 case Float:
Rob Pike4f61fc92010-09-04 10:36:13 +100050 return 7.4
Rob Pikebcb464d2009-03-17 20:55:42 -070051 case String:
Rob Pike4f61fc92010-09-04 10:36:13 +100052 return "hello"
Rob Pikebcb464d2009-03-17 20:55:42 -070053 case Struct:
Rob Pike4f61fc92010-09-04 10:36:13 +100054 return s
Rob Pikebcb464d2009-03-17 20:55:42 -070055 case Chan:
Rob Pike4f61fc92010-09-04 10:36:13 +100056 return c
Rob Pikebcb464d2009-03-17 20:55:42 -070057 case Array:
Rob Pike4f61fc92010-09-04 10:36:13 +100058 return a
Rob Pikebcb464d2009-03-17 20:55:42 -070059 case Map:
Rob Pike4f61fc92010-09-04 10:36:13 +100060 return m
Rob Pikebcb464d2009-03-17 20:55:42 -070061 case Func:
Rob Pike4f61fc92010-09-04 10:36:13 +100062 return f
Rob Pikebcb464d2009-03-17 20:55:42 -070063 }
Rob Pike4f61fc92010-09-04 10:36:13 +100064 panic("bad type number")
Rob Pikebcb464d2009-03-17 20:55:42 -070065}
66
67func main() {
Rob Pikebcb464d2009-03-17 20:55:42 -070068 for i := Bool; i < Last; i++ {
69 switch x := f(i).(type) {
70 case bool:
Rob Pike4f61fc92010-09-04 10:36:13 +100071 assert(x == true && i == Bool, "bool")
Rob Pikebcb464d2009-03-17 20:55:42 -070072 case int:
Rob Pike4f61fc92010-09-04 10:36:13 +100073 assert(x == 7 && i == Int, "int")
Russ Coxf2b5a072011-01-19 23:09:00 -050074 case float64:
75 assert(x == 7.4 && i == Float, "float64")
Rob Pikebcb464d2009-03-17 20:55:42 -070076 case string:
Russ Coxf2b5a072011-01-19 23:09:00 -050077 assert(x == "hello" && i == String, "string")
Rob Pikebcb464d2009-03-17 20:55:42 -070078 case S:
Rob Pike4f61fc92010-09-04 10:36:13 +100079 assert(x.a == 1234 && i == Struct, "struct")
Rob Pikebcb464d2009-03-17 20:55:42 -070080 case chan int:
Rob Pike4f61fc92010-09-04 10:36:13 +100081 assert(x == c && i == Chan, "chan")
Rob Pikebcb464d2009-03-17 20:55:42 -070082 case []int:
Rob Pike4f61fc92010-09-04 10:36:13 +100083 assert(x[3] == 3 && i == Array, "array")
Rob Pikebcb464d2009-03-17 20:55:42 -070084 case map[string]int:
Rob Pike4f61fc92010-09-04 10:36:13 +100085 assert(x == m && i == Map, "map")
Rob Pikebcb464d2009-03-17 20:55:42 -070086 case func(i int) interface{}:
Rob Pike4f61fc92010-09-04 10:36:13 +100087 assert(x == f && i == Func, "fun")
Rob Pikebcb464d2009-03-17 20:55:42 -070088 default:
Rob Pike4f61fc92010-09-04 10:36:13 +100089 assert(false, "unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -070090 }
91 }
92
Rob Pike08eeb252009-03-18 14:05:05 -070093 // boolean switch (has had bugs in past; worth writing down)
Rob Pikebcb464d2009-03-17 20:55:42 -070094 switch {
95 case true:
Rob Pike4f61fc92010-09-04 10:36:13 +100096 assert(true, "switch 2 bool")
Rob Pikebcb464d2009-03-17 20:55:42 -070097 default:
Rob Pike4f61fc92010-09-04 10:36:13 +100098 assert(false, "switch 2 unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -070099 }
100
101 switch true {
102 case true:
Rob Pike4f61fc92010-09-04 10:36:13 +1000103 assert(true, "switch 3 bool")
Rob Pikebcb464d2009-03-17 20:55:42 -0700104 default:
Rob Pike4f61fc92010-09-04 10:36:13 +1000105 assert(false, "switch 3 unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -0700106 }
107
108 switch false {
109 case false:
Rob Pike4f61fc92010-09-04 10:36:13 +1000110 assert(true, "switch 4 bool")
Rob Pikebcb464d2009-03-17 20:55:42 -0700111 default:
Rob Pike4f61fc92010-09-04 10:36:13 +1000112 assert(false, "switch 4 unknown")
Rob Pikebcb464d2009-03-17 20:55:42 -0700113 }
114
Rob Pikebcb464d2009-03-17 20:55:42 -0700115}