8、switch语句

发布时间 2023-03-29 22:27:10作者: 我也有梦想呀

1.switch语句:"开关"

  • switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。
  • switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。而如果switch没有表达式,它会匹配true
  • Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch,但是可以使用fallthrough强制执行后面的case代码。
/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/3/29  19:47
 * @tags 喜欢就去努力的争取
 */
package main

import (
	"errors"
	"fmt"
)

func main() {

	// 语法结构
	/**
	switch var1 {
		case: val1:
		...
		case: val2:
		...
		default:
		...
	}
	*/

	fmt.Println("请输入一个数值:")

	var x int
	fmt.Scan(&x)
	num := x

	switch num {
	case 1:
		fmt.Printf("分支一:num的值为:%d,类型为:%T", num, num)
	case 2:
		fmt.Printf("分支二:num的值为:%d,类型为:%T", num, num)
	default:
		fmt.Printf("默认分支:num的值为:%d,类型为:%T", num, num)
	}

	fmt.Println("main 分支 执行结束......")
	// 小案例:模拟计算器
	fmt.Println("请输入第一个数:")
	var num1 int
	fmt.Scan(&num1)

	fmt.Println("请输入第二个数:")
	var num2 int
	fmt.Scan(&num2)

	fmt.Println("请选择计算方式(1-4):")
	println("1、\t+")
	println("2、\t-")
	println("3、\t*")
	println("4、\t/")
	println("5、\t%")

	// 定义计算方式
	var compute string

	var expr int
	fmt.Scan(&expr)

	switch expr {
	case 1:
		compute = "+"
	case 2:
		compute = "-"
	case 3:
		compute = "*"
	case 4:
		compute = "/"
	case 5:
		compute = "%"
	}

	var result int
	switch compute {
	case "+":
		result = num1 + num2
	case "-":
		result = num1 - num2
	case "*":
		result = num1 * num2
	case "/":
		result = num1 / num2
	case "%":
		result = num1 % num2
	default:
		errors.New("出错了~")
	}
	fmt.Printf("%d \t %s \t %d = %d", num1, compute, num2, result)
}

image

注意事项:

  • 1.switch可以作用在其他类型上,case后的数值必须和switch作用的变量类型一致
  • 2.case是无序的
  • 3.case后的数值是唯一的(duplicate case 3 in switch)
  • 4.default语句是可选的操作

2.一些变形写法

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/3/29  21:01
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	/**
	其他写法1 :省略switch后面的变量
	其他写法2 :case后面更多个值
	其他写法3 :switch后写一条初始化语句


	*/

	// 变形一
	switch {
	case true:
		fmt.Println("true")
	case false:
		fmt.Println("false")
	}
	/**
	成绩:
		0-59:E类,不及格
		60-69:D类,及格
		70-79:C类,中
		80-89:B类,良
		90-100:A类,优秀
	*/
	fmt.Println("请输入分数:")
	score := 0
	fmt.Scan(&score)
	switch {
	case score >= 0 && score < 60:
		fmt.Println("E类,不及格")
	case score >= 60 && score < 70:
		fmt.Println("D类,及格")
	case score >= 70 && score < 80:
		fmt.Println("C类,中")
	case score >= 80 && score < 90:
		fmt.Println("B类,良")
	case score >= 90 && score <= 100:
		fmt.Println("A类,优秀")
	default:
		fmt.Println("成绩有误~~~")
	}

	fmt.Println("-----------------------------")
	// 变形二 :多case值匹配

	fmt.Println("请输入音标:")
	letter := ""
	fmt.Scan(&letter)

	switch letter {
	case "A", "E", "I", "O", "U":
		fmt.Println(letter, "是元音")
	case "M", "N":
		fmt.Println("M或N")
	default:
		fmt.Println("其他")
	}

	// 小案例
	fmt.Println("请输入年份:")
	var year int
	fmt.Scan(&year)

	fmt.Println("请输入月份:")
	var mouth int
	fmt.Scan(&mouth)

	day := 0

	switch mouth {
	case 1, 3, 5, 7, 8, 10, 12:
		day = 31
	case 4, 6, 9, 11:
		day = 30
	case 2:
		if year%100 == 0 || year%4 == 0 && year%100 != 0 {
			day = 29
		} else {
			day = 2812
		}
	default:
		fmt.Println("输入的月份有误")
	}
	fmt.Println(mouth, "有", day, "天")

	// 变形三
	switch i := 1; i {
	case 1:
		fmt.Println("i的值为:", i)
	default:
		fmt.Println("其他...")
	}
	// fmt.Println(i) // 注意:作用域问题
}

3.break;fallthrough

break:
  • 可以使用在switch中,也可以使用在for循环中强制结束case语句,从而结束switch分支
fallthrough:
  • 用于穿透switch当switch中某个case匹配成功之后,就执行该case语句如果遇到fallthrough,那么后面紧邻的case,无需匹配,执行穿透执行。
  • fallthrough应该位于某个case的最后一行
/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/3/29  22:06
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	n := 2
	switch n {
	case 1:
		fmt.Println("熊大")
		fmt.Println("熊大")
		fmt.Println("熊大")
		// 强制结束case
		break
		fmt.Println("熊大")
	case 2:
		fmt.Println("熊二")
		fmt.Println("熊二")
		fmt.Println("熊二")
		// 紧邻的case穿透,不像java语言中默认是穿透的
		fallthrough
	case 3:
		fmt.Println("光头强")
		fmt.Println("光头强")
		fallthrough
	case 4:
		fmt.Println("哈哈哈")
	default:
		fmt.Println("啥也不是~")
	}
}