mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			112 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 float:
 | |
| 			assert(x == 7.4 && i == Float, "float");
 | |
| 		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");
 | |
| 	}
 | |
| 
 | |
| }
 | 
