mirror of
				https://github.com/golang/go.git
				synced 2025-11-03 18:20:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			116 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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")
 | 
						|
	}
 | 
						|
}
 |