go语言学习笔记 — 基础 — 控制流:switch分支选择语句

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 控制流:switch分支选择语句相关的知识,希望对你有一定的参考价值。

switch分支选择语句的特点

  • 可以使用任何类型或表达式作为条件语句
  • 基于不同条件执行不同的动作,每一个case分支都是唯一的,从上到下逐一测试,直到匹配为止(默认只会执行一个case)
  • 每一个case后面也不需要再加break
  • 可理解为一种批量if语句,可方便地判断大量的值,不仅可以判断常量,还可以判断表达式。C/C++语言中的switch语句只支持数值常量,不能对字符串、表达式等复杂情况进行处理
  • 左大括号必须和条件语句在同一行
  • 最多有一个default分支


基本写法

在go中,switch语句的case与case之间是独立代码块,不需要通过break语句跳出当前case块,以避免执行到下一行。格式如下:

switch var {
    case var1表达式1:
        ...
    case var1表达式2:
        ...
    default:
        ...
}

变量var1可以是任何类型,而var1表达式1和var1表达式2则可以是变量var1的任意取值。变量类型不局限于常量或表达式,但必须是相同类型。你可以同时测试多个可能符合条件的值,使用逗号分隔它们,例如:case var1表达式1, var1表达式2, var1表达式3。流程如下:

  • switch语句最多有一个default分支

下面的每一个case语句均是字符串格式,且使用了default分支,Go语言规定每个switch语句最多只能有一个default分支。

var a = "hello"

switch a {
case "hello":
    fmt.Println(1) 
case "world":
    fmt.Println(2) 
default:
    fmt.Println(O)
}    
  • 一分支多值

当多个case语句写在一起时,不同的var表达式之间使用逗号分隔,可以像下面一样:

var a = "num"

switch a {
case "num", "daddy":
    fmt.Println("family")
}
  • 分支表达式

case后不仅仅只跟常量,还可以与if一样跟条件表达式

var r int = 11

switch {
case r > 10 && r < 20:
    fmt.Println(r)
}

这种情况,连判断的目标都没有,switch后面不再跟判断变量。


实例

  • 判断成绩等级
package main

import "fmt"

func main() {
	// 定义局部变量
	var grade string
	var marks int
	fmt.Println("输入一个数字:")
	fmt.Scan(&marks)                // 从命令行获取一个数字,赋给变量marks

	switch {
	case marks >= 90:
		grade = "A"
	case marks < 90 && marks >= 80:
		grade = "B"
	case marks < 80 && marks >= 70:
		grade = "C"
	case marks < 70 && marks >= 60:
		grade = "D"
	default:
		grade = "E"
	}

	switch {
	case grade == "A":
		fmt.Printf("优秀!\\n")
	case grade == "B":
		fmt.Printf("良好\\n")
	case grade == "C":
		fmt.Printf("中等\\n")
	case grade == "D":
		fmt.Printf("及格\\n")
	default:
		fmt.Printf("不及格\\n")
	}
	fmt.Printf("你的等级是 %s\\n", grade)
}
  • Type Switch

switch语句还可以被用于type-switch,以判断某个空接口变量interface{}中实际存储的变量类型。语法如下:

switch x.(type) {
    case type1:
       statement(s)   
    case type2:
       statement(s)
    // 你可以定义任意个数的case
    default: 
       statement(s)
}

实例:判断某个空接口变量interface{}中实际存储的变量类型

package main

import (
	"fmt"
	"testing"
)

func main() {
	var x interface{}

	// switch之后可以有变量初始化语句
	switch i := x.(type) {
	// 当i的类型是以下各种情况时
	case nil:
		fmt.Printf(" x 的类型 :%T", i)
	case int:
		fmt.Printf("x 是 int 型")
	case float64:
		fmt.Printf("x 是 float64 型")
	case func(int) float64:
		fmt.Printf("x 是 func(int) 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型")
	default:
		fmt.Printf("未知型")
	}
}

tips

  • 支持多条件匹配
switch{
    case 1, 2, 3, 4:
        ...
    default:
        ...
}
  • 在条件中,支持一个初始化表达式(可以是并行方式),右侧需跟分号
  • 如果条件满足,但是仍希望继续执行下一个case,需使用fallthrough语句,也可用break终止

switch{
    case 1:
      ...
      if (...) {
        break
    }

    fallthrough  //此时switch会执行case1和case2,但是如果if条件满足,则只执行case1

    case 2:
      ...
    case 3:
      ...
}

以上是关于go语言学习笔记 — 基础 — 控制流:switch分支选择语句的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 控制流:for循环语句

go语言学习笔记 — 基础 — 控制流:if条件(分支)语句

go语言学习笔记 — 基础 — 控制流:goto跳转语句

go语言学习笔记 — 基础 — 控制流:switch分支选择语句

Swift 学习- 06 -- 控制流

java学习--基础知识进阶第十天--笔记