条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句

下图展示了程序语言中条件语句的结构:
Go语言 条件语句 - 图1

Go 语言提供的几种条件判断语句

语句 描述
if 语句 if 语句 由一个布尔表达式后紧跟一个或多个语句组成。
if…else 语句 if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。
if 嵌套语句 你可以在 ifelse if 语句中嵌入一个或多个 ifelse if 语句。
switch 语句 switch 语句用于基于不同条件执行不同动作。
select 语句 select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。

⚠️ 注意: Go 没有三目运算符,所以不支持 condition ? expr1 : expr2 形式的条件判断

if 语句

if 语句由布尔表达式后紧跟一个或多个语句组成

语法
Go 编程语言中 if 语句的语法如下:

  1. if 布尔表达式 {
  2. /* 在布尔表达式为 true 时执行 */
  3. }

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则不执行。流程图如下:
Go语言 条件语句 - 图2

使用 if 判断一个数变量的大小

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 定义局部变量 */
  5. var a int = 10
  6. /* 使用 if 语句判断布尔表达式 */
  7. if a < 20 {
  8. /* 如果条件为 true 则执行以下语句 */
  9. fmt.Printf("a 小于 20\n" )
  10. }
  11. fmt.Printf("a 的值为 : %d\n", a)
  12. }
  13. /*
  14. a 小于 20
  15. a 的值为 : 10
  16. */

if…else 语句

if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行

语法
Go 编程语言中 if…else 语句的语法如下:

  1. if 布尔表达式 {
  2. /* 在布尔表达式为 true 时执行 */
  3. } else {
  4. /* 在布尔表达式为 false 时执行 */
  5. }

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则执行 else 语句块。流程图如下:
Go语言 条件语句 - 图3

使用 if else 判断一个数的大小

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 局部变量定义 */
  5. var a int = 100;
  6. /* 判断布尔表达式 */
  7. if a < 20 {
  8. /* 如果条件为 true 则执行以下语句 */
  9. fmt.Printf("a 小于 20\n" );
  10. } else {
  11. /* 如果条件为 false 则执行以下语句 */
  12. fmt.Printf("a 不小于 20\n" );
  13. }
  14. fmt.Printf("a 的值为 : %d\n", a);
  15. }
  16. /*
  17. a 不小于 20
  18. a 的值为 : 100
  19. */

寻找到 100 以内的所有的素数

  1. package main
  2. import "fmt"
  3. func main(){
  4. // var count,c int //定义变量不使用也会报错
  5. var count int =1
  6. var flag bool
  7. //while(count<100) { //go没有while
  8. for count < 100 {
  9. count++
  10. flag = true;
  11. //注意tmp变量 :=
  12. for tmp:=2;tmp<count;tmp++ {
  13. if count%tmp==0{
  14. flag = false
  15. }
  16. }
  17. // 每一个 if else 都需要加入括号 同时 else 位置不能在新一行
  18. if flag == true {
  19. fmt.Println(count,"素数")
  20. }else{
  21. continue
  22. }
  23. }
  24. }

if … else if … else…

语法

  1. if 布尔表达式 {
  2. /* 在布尔表达式为 true 时执行 */
  3. } else if 布尔表达式 {
  4. /* 在布尔表达式为 false 时执行 */
  5. }else {
  6. /* 在布尔表达式为 false 时执行 */
  7. }

示例

  1. package main
  2. import "fmt"
  3. func main() {
  4. var age int = 23
  5. if age == 25 {
  6. fmt.Println("true")
  7. } else if age < 25 {
  8. fmt.Println("too small")
  9. } else {
  10. fmt.Println("too big")
  11. }
  12. }
  13. /*
  14. too small
  15. */

if 语句嵌套

你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句

语法
Go 编程语言中 if…else 语句的语法如下:

  1. if 布尔表达式 1 {
  2. /* 在布尔表达式 1 为 true 时执行 */
  3. if 布尔表达式 2 {
  4. /* 在布尔表达式 2 为 true 时执行 */
  5. }
  6. }

你可以以同样的方式在 if 语句中嵌套 else if…else 语句

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 定义局部变量 */
  5. var a int = 100
  6. var b int = 200
  7. /* 判断条件 */
  8. if a == 100 {
  9. /* if 条件语句为 true 执行 */
  10. if b == 200 {
  11. /* if 条件语句为 true 执行 */
  12. fmt.Printf("a 的值为 100 , b 的值为 200\n" );
  13. }
  14. }
  15. fmt.Printf("a 值为 : %d\n", a );
  16. fmt.Printf("b 值为 : %d\n", b );
  17. }
  18. /*
  19. a 的值为 100 , b 的值为 200
  20. a 值为 : 100
  21. b 值为 : 200
  22. */

switch 语句

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。 switch 默认情况下 case 最后自带 break 语句,默认只会执行匹配到的那个 case,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough

语法
Go 编程语言中 switch 语句的语法如下:

  1. switch val1 {
  2. case val1:
  3. ...
  4. case val2:
  5. ...
  6. default:
  7. ...
  8. }

变量 val1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。
您可以同时测试多个可能符合条件的值,使用逗号分割它们,支持多条件匹配。例如:case val1, val2, val3

  1. switch{
  2. case 1,2,3,4:
  3. ...
  4. default:
  5. ...
  6. }

image.png/

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 定义局部变量 */
  5. var grade string = "B"
  6. var marks int = 90
  7. switch marks {
  8. case 90: grade = "A"
  9. case 80: grade = "B"
  10. case 50,60,70 : grade = "C"
  11. default: grade = "D"
  12. }
  13. switch {
  14. case grade == "A" :
  15. fmt.Printf("优秀!\n" )
  16. case grade == "B", grade == "C" :
  17. fmt.Printf("良好\n" )
  18. case grade == "D" :
  19. fmt.Printf("及格\n" )
  20. case grade == "F":
  21. fmt.Printf("不及格\n" )
  22. default:
  23. fmt.Printf("差\n" );
  24. }
  25. fmt.Printf("你的等级是 %s\n", grade );
  26. }
  27. /*
  28. 优秀!
  29. 你的等级是 A
  30. */

Type Switch

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。Type Switch 语法格式如下:

  1. switch x.(type){
  2. case type:
  3. statement(s);
  4. case type:
  5. statement(s);
  6. /* 你可以定义任意个数的case */
  7. default: /* 可选 */
  8. statement(s);
  9. }
  1. package main
  2. import "fmt"
  3. func main() {
  4. var x interface{}
  5. switch i := x.(type) {
  6. case nil:
  7. fmt.Printf(" x 的类型 :%T",i)
  8. case int:
  9. fmt.Printf("x 是 int 型")
  10. case float64:
  11. fmt.Printf("x 是 float64 型")
  12. case func(int) float64:
  13. fmt.Printf("x 是 func(int) 型")
  14. case bool, string:
  15. fmt.Printf("x 是 bool 或 string 型" )
  16. default:
  17. fmt.Printf("未知型")
  18. }
  19. }
  20. /*
  21. x 的类型 :<nil>
  22. */

fallthrough

使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true

  1. package main
  2. import "fmt"
  3. func main() {
  4. switch {
  5. case false:
  6. fmt.Println("1、case 条件语句为 false")
  7. fallthrough
  8. case true:
  9. fmt.Println("2、case 条件语句为 true")
  10. fallthrough
  11. case false:
  12. fmt.Println("3、case 条件语句为 false")
  13. fallthrough
  14. case true:
  15. fmt.Println("4、case 条件语句为 true")
  16. case false:
  17. fmt.Println("5、case 条件语句为 false")
  18. fallthrough
  19. default:
  20. fmt.Println("6、默认 case")
  21. }
  22. }
  23. /*
  24. 2、case 条件语句为 true
  25. 3、case 条件语句为 false
  26. 4、case 条件语句为 true
  27. */

break

如果想要执行多个 case,需要使用 fallthrough 关键字,也可用 break 终止

  1. switch{
  2. case 1:
  3. ...
  4. if(...){
  5. break
  6. }
  7. fallthrough // 此时switch(1)会执行case1和case2,但是如果满足if条件,则只执行case1
  8. case 2:
  9. ...
  10. case 3:
  11. ...
  12. default:
  13. ...
  14. }

经典案例

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. a := 1
  7. switch a {
  8. case 0:
  9. fmt.Println("a = 0 ")
  10. case 1:
  11. fmt.Println("a = 1")
  12. default:
  13. fmt.Println("Unknown")
  14. }
  15. }
  16. /*
  17. 运行结果
  18. a = 1
  19. */

switch后带初始化表达式

支持一个初始化表达式(可以是并行方式),右侧需跟分号

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func main() {
  7. var a string ="100"
  8. switch ascapegoat, _ := strconv.ParseInt(a, 10, 64);{
  9. case ascapegoat>90:
  10. fmt.Println("优秀")
  11. case ascapegoat>80:
  12. fmt.Println("良好")
  13. case ascapegoat>70:
  14. fmt.Println("中上")
  15. case ascapegoat>=60:
  16. fmt.Println("及格")
  17. case ascapegoat<60:
  18. fmt.Println("丢人")
  19. default:
  20. fmt.Println("系统出错")
  21. }
  22. }
  23. /*
  24. string到int
  25. int,err:=strconv.Atoi(string)
  26. string到int64
  27. int64, err := strconv.ParseInt(string, 10, 64)
  28. int到string
  29. string:=strconv.Itoa(int)
  30. int64到string
  31. string:=strconv.FormatInt(int64,10)
  32. */
  33. /*
  34. 优秀
  35. */

switch后不带任何条件与表达式

可以使用任何类型或表达式作为条件语句;
不需要写break,一旦条件符合自动终止;
若希望继续执行下一个case,需使用fallthrough语句

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var a = 8
  7. switch {
  8. case a >= 0:
  9. fmt.Println("a >= 0 ")
  10. fallthrough
  11. case a >= 5:
  12. fmt.Println("a >= 5")
  13. fallthrough
  14. default:
  15. fmt.Println("Unknown")
  16. }
  17. }
  18. /*
  19. a >= 0
  20. a >= 5
  21. Unknown
  22. */

select 语句

select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收 select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的

语法
Go 编程语言中 select 语句的语法如下:

  1. select {
  2. case communication clause :
  3. statement(s);
  4. case communication clause :
  5. statement(s);
  6. /* 你可以定义任意数量的 case */
  7. default : /* 可选 */
  8. statement(s);
  9. }

以下描述了 select 语句的语法:

  • 每个 case 都必须是一个通信
  • 所有 channel 表达式都会被求值
  • 所有被发送的表达式都会被求值
  • 如果任意某个通信可以进行,它就执行,其他被忽略。
  • 如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。否则:
    1. 如果有 default 子句,则执行该语句
    2. 如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值 ```go package main import “fmt”

func main() { var c1, c2, c3 chan int var i1, i2 int

select { case i1 = <-c1: fmt.Printf(“received “, i1, “ from c1\n”) case c2 <- i2: fmt.Printf(“sent “, i2, “ to c2\n”) case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt.Printf(“received “, i3, “ from c3\n”) } else { fmt.Printf(“c3 is closed\n”) } default: fmt.Printf(“no communication\n”) }
}

/ no communication /

  1. select 会循环检测条件,如果有满足则执行并退出,否则一直循环检测
  2. ```go
  3. package main
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8. func Chann(ch chan int, stopCh chan bool) {
  9. // var i int = 10
  10. for j := 0; j < 10; j++ {
  11. ch <- j
  12. time.Sleep(time.Second)
  13. }
  14. stopCh <- true
  15. }
  16. func main() {
  17. ch := make(chan int)
  18. c := 0
  19. stopCh := make(chan bool)
  20. go Chann(ch, stopCh)
  21. for {
  22. select {
  23. case c = <-ch:
  24. fmt.Printf("C = <-ch Recvice %d\n", c)
  25. fmt.Println("channel")
  26. case s := <-ch:
  27. fmt.Printf("S := <-ch Receive %d\n", s)
  28. case _ = <-stopCh:
  29. goto end
  30. }
  31. }
  32. end:fmt.Println("程序运行结束")
  33. }
  34. /*
  35. S := <-ch Receive 0
  36. C = <-ch Recvice 1
  37. channel
  38. S := <-ch Receive 2
  39. C = <-ch Recvice 3
  40. channel
  41. C = <-ch Recvice 4
  42. channel
  43. S := <-ch Receive 5
  44. C = <-ch Recvice 6
  45. channel
  46. S := <-ch Receive 7
  47. C = <-ch Recvice 8
  48. channel
  49. S := <-ch Receive 9
  50. 程序运行结束
  51. */