【一Go到底】第十二天---switch

102 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

一、switch介绍

1.1 简介

  • switch 语句用于基于不同条件执行不同动作,每一个case 分支都是唯一的,从上到下逐一测试,直到匹配为止。
  • 匹配项后无需加 break

1.2 基本语法


switch 表达式 {
case 表达式1,表达式2,....:
    代码块1
case 表达式3,表达式4,....:
    代码块2
case 表达式5,表达式6,....:
    代码块3
    ........
default:
    代码块n
}

1.3 案例演示

package main

import "fmt"

func main() {

	// 定义变量 today
	var today byte
	fmt.Printf("请输入数字(1,2,3,4,5):")
	fmt.Scanf("%v", &today)

	switch today {
	case 1:
		fmt.Println("今天是周一,麦当劳等你!")
	case 2:
		fmt.Println("今天是周二,快来达美乐!")
	case 3:
		fmt.Println("今天是周三,尖叫必胜客!")
	case 4:
		fmt.Println("今天是周四,疯狂肯德基!")
	case 5:
		fmt.Println("今天是周五,华莱士痛苦!")
	default:
		fmt.Println("输入错误,请重新输入....")
	}
}

二、使用详解

  1. case 后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
  2. case后的各个表达式的值的数据类型,必须和switch 的表达式数据类型一致
  3. case后面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2..
  4. case后面的表达式如果是常量值(字面量),则要求不能重复
  5. case后面不需要带break,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default
  6. default 语句不是必须的.
  7. switch 后也可以不带表达式,当作if---else使用
  8. switch 后也可以直接声明/定义一一个变量,分号结束,不推荐。
  9. switch 穿透 fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透。
package main

import "fmt"

func main() {
	// switch - fallthrough
	var num int = 10
	switch num {
	case 10:
		fmt.Println("case 1")
		fallthrough // 执行case 10后继续执行 case 20 , 但不会执行 case 30, 默认穿透一层
	case 20:
		fmt.Println("case 2")
	case 30:
		fmt.Println("case 3")
	default:
		fmt.Println("未匹配....")
	}
}

  1. Type Switch: switch 语句还可以被用于type-switch来判断某个interface 变量中实际指向的变量类型
package main

import "fmt"

func main() {
	// Type Switch 案例演示

	// 声明空的接口
	var x interface{}
	// 声明float64类型变量 y
	var y = 10.0

	// 将 y 赋值给 x,此时 x 类型为 float64
	x = y

	switch i := x.(type) { // x.(type) 判断x 的类型
	case nil:
		fmt.Printf("x 类型为 : %T\n", i)
	case int:
		fmt.Printf("x 类型为 : %T\n", i)
	case float64:
		fmt.Printf("x 类型为 : %T\n", i)
	case func(int) float64:
		fmt.Printf("x 类型为 : %T\n", i)
	case bool, string:
		fmt.Printf("x 类型为 : %T\n", i)
	default:
		fmt.Printf("x 类型为 : %T\n", i)
	}
}

三、案例演示

3.1 小写转大写

从键盘输入一个小写字符,转换为大写,其中a,b,c,d转换为对应的大写,其他的直接输出other

package main

import "fmt"

func main() {

	// char 转换
	// 将小写字母转换为大写,只转换 a,b,c,d ,  其他的输出other

	// 定义变量
	var char byte
	fmt.Printf("请输入一个字母:")
	fmt.Scanf("%c", &char)

	switch char {
	case 'a':
		fmt.Printf("%c\n", char-32)
	case 'b':
		fmt.Printf("%c\n", char-32)
	case 'c':
		fmt.Printf("%c\n", char-32)
	case 'd':
		fmt.Printf("%c\n", char-32)
	default:
		fmt.Println("other")
	}

}

3.2 月份转换

根据用户输入的 月份,输出对应的季节

package main

import "fmt"

func main() {

	// 将对应的月份输出为对应的季节
	var month byte

	fmt.Printf("请输入月份:")
	fmt.Scanln(&month)

	switch month {
	case 1, 2, 3:
		fmt.Println("当前月份属于 春季 ")
	case 4, 5, 6:
		fmt.Println("当前月份属于 夏季 ")
	case 7, 8, 9:
		fmt.Println("当前月份属于 秋季 ")
	case 10, 11, 12:
		fmt.Println("当前月份属于 冬季 ")
	default:
		fmt.Println("输入错误,请重新输入......")
	}
}

3.3 根据日期(星期几)报菜单

package main

import "fmt"

func main() {

	// 根据星期几报菜单

	var daily string
	fmt.Printf("请输入日期(星期):")
	fmt.Scanln(&daily)

	switch daily {
	case "星期一":
		fmt.Println("今天吃汉堡")
	case "星期二":
		fmt.Println("今天吃香肠")
	case "星期三":
		fmt.Println("今天吃土豆泥")
	case "星期四":
		fmt.Println("今天吃羊肉")
	case "星期五":
		fmt.Println("今天吃葱爆牛肉")
	case "星期六":
		fmt.Println("今天吃印度咖喱鸡")
	case "星期日":
		fmt.Println("今天吃扬州炒饭")
	default:
		fmt.Println("输入错误,请重新输入")
	}

}