选择结构 switch

优质
小牛编辑
144浏览
2023-12-01

和 C 语言不同的的是

  • 和if一样,表达式前面可以添加初始化语句
  • 和if一样,不需要编写圆括号
  • 和if一样,左大括号必须和表达式在同一行
  • case 表达式的值不一定要是常量,甚至可以不用传递
  • 一个 case 后面可以有多个表达式,满足其中一个就算匹配
  • case 后面不需要添加 break
  • 可以在 case 语句块最后添加 fallthrough,实现 case 穿透
  • case 后面定义变量不需要添加 {} 明确范围

格式

switch 初始化语句; 表达式{
  case 表达式1, 表达式2:
        语句块;
  case 表达式1, 表达式2:
        语句块;
  default:
        语句块;
}
package main
import "fmt"
func main() {
	switch num := 3;num {
		case 1:
			fmt.Println("星期一")
		case 2:
			fmt.Println("星期二")
		case 3:
			fmt.Println("星期三")
		case 4:
			fmt.Println("星期四")
		case 5:
			fmt.Println("星期五")
		case 6:
			fmt.Println("星期六")
		case 7:
			fmt.Println("星期日")
		default:
			fmt.Println("Other...")
	}
}
package main
import "fmt"
func main() {
	switch num := 3;num {
	case 1,2,3,4,5:
		fmt.Println("工作日")
	case 6,7:
		fmt.Println("非工作日")
	default:
		fmt.Println("Other...")
	}
}

注意点:

  • case 后面不用编写 break,不会出现 case 穿透问题
  • 如果想让 case 穿透,必须在 case 语句块最后添加 fallthrough 关键
package main
import "fmt"
func main() {
	switch num := 3;num {
	case 1:
		fallthrough
	case 2:
		fallthrough
	case 3:
		fallthrough
	case 4:
		fallthrough
	case 5:
		fmt.Println("工作日")
	case 6:
		fallthrough
	case 7:
		fmt.Println("非工作日")
	default:
		fmt.Println("Other...")
	}
}

case 后面不仅仅可以放常量,还可以放变量和表达式

package main
import "fmt"
func main() {
	value := 2
	switch num:=1; num {
	case value: // 变量
		fmt.Println("num等于value")
	default:
		fmt.Println("num不等于value")
	}
}
package main
import "fmt"
func main() {
	value := 2
	switch num:=1; num {
	case getValue(): // 函数
		fmt.Println("num等于value")
	default:
		fmt.Println("num不等于value")
	}
}
func getValue() int {
	return 1
}
package main
import "fmt"
func main() {
	switch num:=18; {
		case num >=0 && num <=10: // 表达式
			fmt.Println("num是一个0~10之间的数")
		case num >10 && num <=20:
			fmt.Println("num是一个11~20之间的数")
		default:
			fmt.Println("num是一个大于20的数")
	}
}

case 后面定义变量不用添加 {} 明确作用于范围

package main
import "fmt"
func main() {
    switch num := 1;num {
	  case 1:
		value := 10 // 不会报错
		fmt.Println(value)
	  default:
		fmt.Println("Other...")
	}
}

其它特性和 C 语言一样