10.1 switch.go

package main

import "fmt"

func sum() int {
   return 44
}
func test(x int) int {
   a := 5
   b := 2
   return a + b + x
}
func main() {
   //todo:示例一 switch后面有一个表达式,case后面有一到多个表达式,前面的case匹配
   //到执行了,后面的case即使也匹配但不会执行;switch和case表达式最终的值的类型要一致
   n := 44
   m := 22
   o := "我是字符串"
   switch n {
   case 11, 22, 33: //todo:case后面可以有多个表达式,用逗号隔开,多个表达式为常量时不得有重复
      fmt.Print("find it")
   case sum():
      fmt.Println("a function")
      //case "44": //todo:报错:Invalid case '"44"' in switch on 'n' (mismatched types 'string' and 'int')
      fmt.Println("something strange")
      //case o:     //报错:Invalid case 'o' in switch on 'n' (mismatched types 'string' and 'int')
      fmt.Println("o=", o)
   case m * 2, 55, sum() * 2: //todo:由于第二个case匹配上了,因此即使这个case也匹配,但由于case的先后顺序,该case不会执行
      fmt.Println("find another")
   default:
      fmt.Println("have not find")
   }

   //todo:示例二  switch后面可以是表达式【包括可以是有返回值的函数】
   switch test(3) / 2 {
   case 2:
      fmt.Println("是2")
   case 5:
      fmt.Println("是5")
   }

   //todo:示例三 switch后面没有表达式,此时默认switch后面表达式的bool值且为true

   num := "一个字符串"
   switch {
   case num == "什么东西":
      fmt.Println("不匹配")
      //case "haha"://todo:报错 Invalid case '"haha"' in switch on 'true' (mismatched types 'string' and 'bool')
      fmt.Println("haha")
   case true: //可见switch后面没有表达式时,switch后面默认是true这个值的
      fmt.Println("true") //todo:会打印true,且尽管len(num)大于2,但不会打印“大于2”,因为只匹配最先匹配上的case后就会跳出switch
   case len(num) > 2:
      fmt.Println("大于2")
   case len(num) > 4:
      fmt.Println("大于4")
   }

   num2 := "另一个字符串"
   switch {
   case num2 == "什么东西":
      fmt.Println("不匹配")
   case len(num2) > 2:
      fmt.Println("大于2") //会打印“大于2”
      fallthrough        //todo:fallthrough必须单独成行,只能穿透一层
   case len(num2) > 4:
      fmt.Println("大于4") //由于有fallthrough,不经过判断len(num)>4,这里就会直接输出“大于4”
      fallthrough
   case len(num2) > 88:
      fmt.Println("大于88") //todo:虽然num的长度并不大于88,但仍会输出"大于88"
      //goto   //switch中还是没法通过goto 和 label来执行两个case
   case len(num2) > 888:
      fmt.Println("大于888")
   }

   //todo:和类型断言一起使用
   var x interface{}
   var y = 10.0
   x = y
   //k := x.(int)  //todo:虽然不报错,但跑起来后会报错,说  panic: interface conversion: interface {} is float64, not int
   j := x.(float64)
   fmt.Printf("j的类型为%T,值为%v\n", j, j) //j的类型为float64,值为10
   //fmt.Printf("k的类型为%T,值为%v",k,k)//j的类型为float64,值为10
   switch i := x.(type) { //todo:会自动的用i【i是一个类型,不是值】
   case int:
      fmt.Println(i, "是int类型") //todo:这里就是用一下i,不然报错说i申明了没使用,各个case后的表达式并不需要有i
   case float64:
      fmt.Println("是float64类型")
   case float32:
      fmt.Println("是float323类型")
   case string:
      fmt.Println("是字符串类型")

   }

   //todo:最后一种方式,不推荐
   switch grade := 90; { //todo:分号不能省略
   case grade > 66:
      fmt.Println("大于66")
   case 55 < grade && grade < 66:
      fmt.Println("在55和66之间")
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值