typeswitch.go 1.77 KB
Newer Older
Russ Cox's avatar
Russ Cox committed
1
// run
Rob Pike's avatar
Rob Pike committed
2 3 4 5 6 7 8

// 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.

package main

9 10
import "os"

Rob Pike's avatar
Rob Pike committed
11
const (
Rob Pike's avatar
Rob Pike committed
12 13 14 15 16 17 18 19 20 21
	Bool = iota
	Int
	Float
	String
	Struct
	Chan
	Array
	Map
	Func
	Last
Rob Pike's avatar
Rob Pike committed
22 23
)

24 25 26 27
type S struct {
	a int
}

Rob Pike's avatar
Rob Pike committed
28 29
var s S = S{1234}

Rob Pike's avatar
Rob Pike committed
30
var c = make(chan int)
Rob Pike's avatar
Rob Pike committed
31

32
var a = []int{0, 1, 2, 3}
Rob Pike's avatar
Rob Pike committed
33 34 35 36 37

var m = make(map[string]int)

func assert(b bool, s string) {
	if !b {
Rob Pike's avatar
Rob Pike committed
38 39
		println(s)
		os.Exit(1)
Rob Pike's avatar
Rob Pike committed
40 41 42 43 44 45
	}
}

func f(i int) interface{} {
	switch i {
	case Bool:
Rob Pike's avatar
Rob Pike committed
46
		return true
Rob Pike's avatar
Rob Pike committed
47
	case Int:
Rob Pike's avatar
Rob Pike committed
48
		return 7
Rob Pike's avatar
Rob Pike committed
49
	case Float:
Rob Pike's avatar
Rob Pike committed
50
		return 7.4
Rob Pike's avatar
Rob Pike committed
51
	case String:
Rob Pike's avatar
Rob Pike committed
52
		return "hello"
Rob Pike's avatar
Rob Pike committed
53
	case Struct:
Rob Pike's avatar
Rob Pike committed
54
		return s
Rob Pike's avatar
Rob Pike committed
55
	case Chan:
Rob Pike's avatar
Rob Pike committed
56
		return c
Rob Pike's avatar
Rob Pike committed
57
	case Array:
Rob Pike's avatar
Rob Pike committed
58
		return a
Rob Pike's avatar
Rob Pike committed
59
	case Map:
Rob Pike's avatar
Rob Pike committed
60
		return m
Rob Pike's avatar
Rob Pike committed
61
	case Func:
Rob Pike's avatar
Rob Pike committed
62
		return f
Rob Pike's avatar
Rob Pike committed
63
	}
Rob Pike's avatar
Rob Pike committed
64
	panic("bad type number")
Rob Pike's avatar
Rob Pike committed
65 66 67 68 69 70
}

func main() {
	for i := Bool; i < Last; i++ {
		switch x := f(i).(type) {
		case bool:
Rob Pike's avatar
Rob Pike committed
71
			assert(x == true && i == Bool, "bool")
Rob Pike's avatar
Rob Pike committed
72
		case int:
Rob Pike's avatar
Rob Pike committed
73
			assert(x == 7 && i == Int, "int")
74 75
		case float64:
			assert(x == 7.4 && i == Float, "float64")
Rob Pike's avatar
Rob Pike committed
76
		case string:
77
			assert(x == "hello" && i == String, "string")
Rob Pike's avatar
Rob Pike committed
78
		case S:
Rob Pike's avatar
Rob Pike committed
79
			assert(x.a == 1234 && i == Struct, "struct")
Rob Pike's avatar
Rob Pike committed
80
		case chan int:
Rob Pike's avatar
Rob Pike committed
81
			assert(x == c && i == Chan, "chan")
Rob Pike's avatar
Rob Pike committed
82
		case []int:
Rob Pike's avatar
Rob Pike committed
83
			assert(x[3] == 3 && i == Array, "array")
Rob Pike's avatar
Rob Pike committed
84
		case map[string]int:
Russ Cox's avatar
Russ Cox committed
85
			assert(x != nil && i == Map, "map")
Rob Pike's avatar
Rob Pike committed
86
		case func(i int) interface{}:
Russ Cox's avatar
Russ Cox committed
87
			assert(x != nil && i == Func, "fun")
Rob Pike's avatar
Rob Pike committed
88
		default:
Rob Pike's avatar
Rob Pike committed
89
			assert(false, "unknown")
Rob Pike's avatar
Rob Pike committed
90 91 92
		}
	}

93
	// boolean switch (has had bugs in past; worth writing down)
Rob Pike's avatar
Rob Pike committed
94 95
	switch {
	case true:
Rob Pike's avatar
Rob Pike committed
96
		assert(true, "switch 2 bool")
Rob Pike's avatar
Rob Pike committed
97
	default:
Rob Pike's avatar
Rob Pike committed
98
		assert(false, "switch 2 unknown")
Rob Pike's avatar
Rob Pike committed
99 100 101 102
	}

	switch true {
	case true:
Rob Pike's avatar
Rob Pike committed
103
		assert(true, "switch 3 bool")
Rob Pike's avatar
Rob Pike committed
104
	default:
Rob Pike's avatar
Rob Pike committed
105
		assert(false, "switch 3 unknown")
Rob Pike's avatar
Rob Pike committed
106 107 108 109
	}

	switch false {
	case false:
Rob Pike's avatar
Rob Pike committed
110
		assert(true, "switch 4 bool")
Rob Pike's avatar
Rob Pike committed
111
	default:
Rob Pike's avatar
Rob Pike committed
112
		assert(false, "switch 4 unknown")
Rob Pike's avatar
Rob Pike committed
113 114
	}
}