Golang语言基础教程:switch分支语句

JamesNan 2019-05-10

Golang语言基础教程:switch分支语句

一、程序的流程结构

程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。

二、条件语句

switch语句:“开关”

switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。

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

switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。

而如果switch没有表达式,它会匹配true

Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。

您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。

switch var1 {
 case val1:
 ...
 case val2:
 ...
 default:
 ...
}

示例代码:

package main
​
import "fmt"
​
func main() {
 /* 定义局部变量 */
 var grade string = "B"
 var marks int = 90
​
 switch marks {
 case 90: grade = "A"
 case 80: grade = "B"
 case 50,60,70 : grade = "C" //case 后可以由多个数值
 default: grade = "D" 
 }
​
 switch {
 case grade == "A" :
 fmt.Printf("优秀!
" ) 
 case grade == "B", grade == "C" :
 fmt.Printf("良好
" ) 
 case grade == "D" :
 fmt.Printf("及格
" ) 
 case grade == "F":
 fmt.Printf("不及格
" )
 default:
 fmt.Printf("差
" );
 }
 fmt.Printf("你的等级是 %s
", grade ); 
}

fallthrough

如需贯通后续的case,就添加fallthrough

package main
​
import (
 "fmt"
)
​
type data [2]int
​
func main() {
 switch x := 5; x {
 default:
 fmt.Println(x)
 case 5:
 x += 10
 fmt.Println(x)
 fallthrough
 case 6:
 x += 20
 fmt.Println(x)
​
 }
​
}
​

运行结果:

15
35

case中的表达式是可选的,可以省略。如果该表达式被省略,则被认为是switch true,并且每个case表达式都被计算为true,并执行相应的代码块。

示例代码:

package main
​
import ( 
 "fmt"
)
​
func main() { 
 num := 75
 switch { // expression is omitted
 case num >= 0 && num <= 50:
 fmt.Println("num is greater than 0 and less than 50")
 case num >= 51 && num <= 100:
 fmt.Println("num is greater than 51 and less than 100")
 case num >= 101:
 fmt.Println("num is greater than 100")
 }
​
}

switch的注意事项

  • case后的常量值不能重复
  • case后可以有多个常量值
  • fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。

Type Switch

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。

switch x.(type){
 case type:
 statement(s); 
 case type:
 statement(s); 
 /* 你可以定义任意个数的case */
 default: /* 可选 */
 statement(s);
}
package main
​
import "fmt"
​
func main() {
 var x interface{}
 
 switch i := x.(type) {
 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("未知型") 
 } 
}

运行结果:

x 的类型 :<nil>

相关推荐