mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 08:40:55 +00:00 
			
		
		
		
	 f2b5a07453
			
		
	
	
		f2b5a07453
		
	
	
	
	
		
			
			also: cmplx -> complex float64(1.0) -> 1.0 float64(1) -> 1.0 R=gri, r, gri1, r2 CC=golang-dev https://golang.org/cl/3991043
		
			
				
	
	
		
			115 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // $G $F.go && $L $F.$A && ./$A.out
 | |
| 
 | |
| // 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
 | |
| 
 | |
| 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 == m && i == Map, "map")
 | |
| 		case func(i int) interface{}:
 | |
| 			assert(x == f && 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")
 | |
| 	}
 | |
| 
 | |
| }
 |