我们来看下 switch
value6 := interface{}(byte(127)) switch t := value6.(type){ // 这条语句无法编译通过。 case uint8,uint16: //byte是uint8别名 fmt.Println("uint8 or uint16") case byte: fmt.Printf("byte") default: fmt.Printf("unsupported type: %T", t) }
我们今天主要讨论了for语句和switch语句,不过我并没有说明那些语法规则,因为它们太简单了。我们需要多加注意的往往是那些隐藏在 Go 语言规范和最佳实践里的细节。
这些细节其实就是我们很多技术初学者所谓的“坑”。比如,我在讲for语句的时候交代了携带range子句时只有一个迭代变量意味着什么。你必须知道在迭代数组或切片时只有一个迭代变量的话是无法迭代出其中的元素值的,否则你的程序可能就不会像你预期的那样运行了。
还有,range表达式的结果值是会被复制的,实际迭代时并不会使用原值。至于会影响到什么,那就要看这个结果值的类型是值类型还是引用类型了。
说到switch语句,你要明白其中的case表达式的所有子表达式的结果值都是要与switch表达式的结果值判等的,因此它们的类型必须相同或者能够都统一到switch表达式的结果类型。如果无法做到,那么这条switch语句就不能通过编译。
最后,同一条switch语句中的所有case表达式的子表达式的结果值不能重复,不过好在这只是对于由字面量直接表示的子表达式而言的。
请记住,普通case子句的编写顺序很重要,最上边的case子句中的子表达式总是会被最先求值,在判等的时候顺序也是这样。因此,如果某些子表达式的结果值有重复并且它们与switch表达式的结果值相等,那么位置靠上的case子句总会被选中。
switch 很多种表达
expr := 9 //默认不需要break switch expr { case 9: t.Log("is case ") } switch { //可以模拟if else case expr > 0 && expr < 10: t.Log("is case") } for n := 0; n < 5; n++ { switch { case n%2 == 0: // 多匹配 t.Log("even") case n%2 == 1: t.Log("odd") } }
func CheckType(v interface{}) { t := reflect.TypeOf(v) switch t.Kind() { case reflect.String: fmt.Println("type is string") case reflect.Int32: fmt.Println("type is int32") default: fmt.Println("type is unknown") } }