【Go 基础】switch 流程控制

switch 语句

PHP语法:

<?php
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
        echo "i is not equal to 0, 1 or 2";
}
?>

Java语法:

switch (表达式) {
 case 常量1:
  语句1;
  break;
 case 常量2:
  语句2;
  break;
 default:
  语句2;
}

Go语法:

switch 表达式 {
 case 表达式1,表达式2,...:
  语句块1;
 case 表达式3,表达式4,...:
  语句块2;
 // ...多个case语句
 default:
  语句块;
}

Go 中的 switch 语句与 JavaPHP 中的语法不同在于匹配项后面不需要加 break

使用注意细节和事项:

  • case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)。
package main
import (
 "fmt"
)
func test(char byte) byte {
 return char + 1
}
func main() {
 var key byte
 fmt.Println("请输入一个字符 a,b,c,d,e,f,g")
 fmt.Scanf("%c", &key)

 switch test(key) - 1 {
 case 'a':
  fmt.Println("周一")
 case 'b':
  fmt.Println("周二")
 case 'c':
  fmt.Println("周三")
 //...
 default:
  fmt.Println("输入有误...")
 }
}
  • case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致。
var n1 int32 = 51
var n2 int64 = 20
 switch n1 {
  case n2: // invalid case n2 in switch on n1 (mismatched types int64 and int32)
   fmt.Println("ok1")
  case 90 : 
   fmt.Println("ok2~")
 }
  • case 后面可以带多个表达式,使用逗号间隔。比如 case 表达式 1, 表达式 2 ...。
var n1 int32 = 51
var n2 int32 = 20
 switch n1 {
  case n2, 10, 5 : // case 后面可以有多个表达式
   fmt.Println("ok1")
  case 90 : 
   fmt.Println("ok2~")
   }
  • case后面的表达式如果是常量值(字面量),则要求不能重复。
var n1 int32 = 5
var n2 int32 = 20
 switch n1 {
 case n2, 10, 5: // case 后面可以有多个表达式
  fmt.Println("ok1")
 case 5: // case 后面的表达式不能重复,上面的case中已经存在5
  fmt.Println("ok2") // duplicate case 5 in switch
 default:
  fmt.Println("ok3")
 }
  • case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch,如 果一个都匹配不到,则执行 default
  • default 语句不是必须的。
  • switch 后也可以不带表达式,类似 if --else 分支来使用。
var score int = 90
 switch {
 case score > 90:
  fmt.Println("成绩优秀...")
 case score >= 70 && score <= 90:
  fmt.Println("成绩优良...") // 成绩优良...
 case score >= 60 && score < 70:
  fmt.Println("成绩及格...")
 default:
  fmt.Println("不及格")
 }
  • switch 后也可以直接声明/定义一个变量,分号结束,但是不推荐。
switch score := 90; {
 case score > 90:
  fmt.Println("成绩优秀...")
 case score >= 70 && score <= 90:
  fmt.Println("成绩优良...") // 成绩优良...
 case score >= 60 && score < 70:
  fmt.Println("成绩及格...")
 default:
  fmt.Println("不及格")
 }
  • switch 穿透-fallthrough ,如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也 叫 switch 穿透。
var num int = 10
 switch num {
 case 10:
  fmt.Println("ok1") // ok1
  fallthrough // 默认只能穿透一层
 case 20:
  fmt.Println("ok2") // ok2
  fallthrough
 case 30:
  fmt.Println("ok3") // ok3
 default:
  fmt.Println("没有匹配到..")
 }
  • Type Switch:switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的 变量类型。
var x interface{}
var y = 10.0
x = y
 switch i := x.(type) {
 case nil:
  fmt.Printf("x 的类型为:%T", i)
 case int:
  fmt.Printf("x 是 int 型")
 case float64:
  fmt.Printf("x 是 float64 型") // x 是 float64 型
 case func(int) float64:
  fmt.Printf("x 是 func(int)型")
 case bool, string:
  fmt.Printf("x 是 bool 或者 string 型")
 default:
  fmt.Printf("未知")
 }

示例1:对学生成绩大于60分的,输出合格。低于60分的,输出不合格,输入的成绩不能大于100。

var score float64
 fmt.Println("请输入成绩")
 fmt.Scanln(&score)
 switch int(score / 60) {
 case 1:
  fmt.Println("及格")
 case 0:
  fmt.Println("不及格")
 default:
  fmt.Println("输入有误..")
 }

示例2:根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季。

var month byte
 fmt.Println("请输入月份")
 fmt.Scanln(&month)
 switch month {
 case 3, 4, 5:
  fmt.Println("spring")
 case 6, 7, 8:
  fmt.Println("summer")
 case 9, 10, 11:
  fmt.Println("autumn")
 case 12, 1, 2:
  fmt.Println("winter")
 default:
  fmt.Println("输入有误..")
 }

如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型,建议使用 swtich 语句,简洁高效。

如果对区间判断和结果为 bool 类型的判断,使用ifif 的使用范围更广。

相关推荐

微信扫一扫,分享到朋友圈

【Go 基础】switch 流程控制
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close