目录
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为true来决定是否执行指定语句,并在条件为false的情况在执行另外的语句。
语句 | 描述 |
---|---|
if 语句 | if 语句由一个布尔表达式后紧跟一个或多个语句组成。 |
if…else 语句 | if 语句后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。 |
if 嵌套语句 | 你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。 |
switch 语句 | switch 语句用于基于不同条件执行不同动作。 |
select 语句 | select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 |
1、if语句
if 语句由布尔表达式后紧跟一个或多个语句组成。
if 布尔表达式(true/false){
/*在布尔表达式为true时执行*/}
流程图
示例
2、if else语句
if语句后可以使用可选的else语句, else语句中的表达式在布尔表达式为false时执行。
if 布尔表达式(true/false){
/*在布尔表达式为true时执行*/}else 布尔表达式(true/false){
/*在布尔表达式为false时执行*/}
if 在布尔表达式为 true 时,其后紧随的语句块执行,如果为 false 则执行 else 语句块
流程图
示例
3、if语句嵌套
以在if或else if 语句中嵌入一个或多个if或else if 语句。
if 布尔表达式1 {
/*在布尔表达式1为true 时执行*/
if 布尔表达式2 {
/*在布尔表达式2为true 时执行*/
}
}
示例
4、switch语句
switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上至下逐一测试,直到匹配为止。
switch语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
switch 默认情况下case最后自带 break语句,匹配成功后就不会执行其他case,如果我们需要执行后面的case,可以使用fallthrough 。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
变量 var1 可以是任何类型,而 val1 和val2 则可以是同类型的任意值,类型不被局限于常量或整数,但是必须是相同的类型;或者最终结果为相同类型的表达式
流程图
示例
Type Switch
switch语句还可以被用于type-switch来判断某个interface(接口)变量中实际存储的变量类型
判断接口类型——引入空接口
switch x.(type){
case type :
statement(s);
case Iype:
statement(s);
/*你可以定义任意个数的case */
default:/*可选*/
statement(s);
}
示例
写法一
package main
import "fmt"
//全局变量可以不被调用,函数中申明的变量一定要被使用,否则会报错
//type-switch语句,判断数据类型
func main() {
var x interface{}
//判断数据类型type只能使用搭配switch,如果想单独使用输出数据类型,需要使用反射
switch i := x.(type) {
case nil:
fmt.Printf("数据类型为%T", i)
case int:
fmt.Printf("数据类型为int")
case float32, float64:
fmt.Printf("数据类型是浮点型")
case string:
fmt.Printf("数据类型是字符串")
case bool:
fmt.Printf("数据类型是布尔型")
default:
fmt.Printf("数据类型是其他类型")
}
}
##
数据类型为<nil>
写法二
package main
import "fmt"
//全局变量可以不被调用,函数中申明的变量一定要被使用,否则会报错
//type-switch语句,判断数据类型
func main() {
var number = 123
oyyy(number)
}
func oyyy(x interface{}) {
switch i := x.(type) {
case nil:
fmt.Printf("数据类型为%T", i)
case int:
fmt.Printf("数据类型为int")
case float32, float64:
fmt.Printf("数据类型是浮点型")
case string:
fmt.Printf("数据类型是字符串")
case bool:
fmt.Printf("数据类型是布尔型")
default:
fmt.Printf("数据类型是其他类型")
}
}
##
数据类型为int
写法三
//反射
package main
import (
"fmt"
"reflect"
)
//反射原理判断数据类型
func main() {
var number *int
fmt.Println("数据类型是:", reflect.TypeOf(number))
}
##
数据类型是: *int
fallthrough
使用falthrough 会强制执行后面的case语句,fallthrough不会判断下一条case的表达式结果是否为true。
示例
package main
import "fmt"
//fallthrough语句无视后面语句的判断结果,继续往下执行
func main() {
switch {
case false:
fmt.Println("1为false")
fallthrough
case true:
fmt.Println("2为true")
fallthrough
case false:
fmt.Println("3为flase")
case true:
fmt.Println("4为true")
fallthrough
default:
fmt.Println("5")
}
}
##
2为true
3为flase
5、select语句
select是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。
select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。
select {
case communication clause:
statement(s);
case communication clause:
statement(s);
/*你可以定义任意数量的case " */
default : /*可选*/
statement(s);
}
-
每个case都必须是一个通信
-
所有channel表达式都会被求值
-
所有被发送的表达式都会被求值
-
如果任意某个通信可以进行,它就执行,其他被忽略。
-
如果有多个case都可以运行,Select 会随机公平地选出一个执行。其他不会执行。否则:
-
如果有default子句,则执行该语句。
-
如果没有default子句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求
-