分支控制

if后面的条件判断子句不需要用小括号括起来 。
if后面可以带一个简单的初始化语句,并以分号分割,该简单语句声明 的变量的作用域是整if语句块,包括后面的else if和 else分支。

注意:go不支持三元操作符(三目运算符)

  1. "a > b ? a : b"

单分支控制

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

eg:

  1. package main
  2. import "fmt"
  3. func main() {
  4. num := -1
  5. if num < 0 {
  6. num = -num
  7. }
  8. fmt.Println(num)
  9. }

双分支控制

  1. if 布尔表达式{
  2. }else{
  3. }

eg:

  1. package main
  2. import "fmt"
  3. func main() {
  4. score := 59
  5. if score >= 60 {
  6. fmt.Println("pass")
  7. } else {
  8. fmt.Println("not pass")
  9. }
  10. }

多分支控制

  1. if 条件表达式1{
  2. }else if条件表达式2 {
  3. }else{
  4. }

eg:

  1. package main
  2. import "fmt"
  3. func judgeScore(score int) string {
  4. var result string
  5. if score >= 90 {
  6. result = "优"
  7. } else if score >= 80 {
  8. result = "良"
  9. } else if score >= 70 {
  10. result = "中"
  11. } else if score >= 60 {
  12. result = "及格"
  13. } else {
  14. result = "继续努力"
  15. }
  16. return result
  17. }
  18. func main() {
  19. fmt.Println(judgeScore(75))
  20. fmt.Println(judgeScore(40))
  21. fmt.Println(judgeScore(95))
  22. fmt.Println(judgeScore(63))
  23. fmt.Println(judgeScore(86))
  24. }

执行结果

  1. 继续努力
  2. 及格

switch

Go的switch非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项;
而如果switch没有表达式,它会匹配true。
Go里面switch默认相当于每个case最后带有break,
匹配成功后不会自动向下执行其他case,而是跳出整个switch,
省略条件表达式,可当 if…else if…else

  1. package main
  2. import "fmt"
  3. func GetGrade(sore int) (grade string) {
  4. switch {
  5. case sore > 80:
  6. grade = "A"
  7. case sore > 60:
  8. grade = "B"
  9. default:
  10. grade = "C"
  11. }
  12. return
  13. }
  14. func main() {
  15. fmt.Printf("你的等级是 %s\n", GetGrade(90))
  16. fmt.Printf("你的等级是 %s\n", GetGrade(78))
  17. fmt.Printf("你的等级是 %s\n", GetGrade(35))
  18. }

执行结果

  1. 你的等级是 A
  2. 你的等级是 B
  3. 你的等级是 C

用fallthrough强制执行后面的case代码

  1. package main
  2. import "fmt"
  3. func main() {
  4. var k = 0
  5. switch k {
  6. case 0:
  7. println("fallthrough")
  8. fallthrough
  9. case 1:
  10. fmt.Println("1")
  11. case 2:
  12. fmt.Println("2")
  13. default:
  14. fmt.Println("def")
  15. }
  16. }

执行结果,使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。注意fallthrough 只能穿透下一层。

  1. 0
  2. 1

同时可以将多个case 合并在一起

  1. package main
  2. import "fmt"
  3. func main() {
  4. var m = 0
  5. switch m {
  6. case 0, 1:
  7. fmt.Println("1")
  8. case 2:
  9. fmt.Println("2")
  10. default:
  11. fmt.Println("def")
  12. }
  13. }

循环控制

Go 语言仅支持一种循环语句, 即 for语句,go 语言没有while和do while

  1. for 循环初始化;循环条件;循环变量迭代{
  2. }

类似 的 while 循环语句

  1. for 循环判断条件{
  2. }

类似 while (1)死循环语句

  1. for {
  2. }

标签和跳转

Go语言使用标签(Lable)来标识一个语句的位置,用于 goto 、break、 continue 语句的跳转,标签的语法是:
goto语句本身就是做跳转用的,而break和continue是配合for使用的。所以goto的使用不限于for,
通常与条件语句配合使用 在for循环中break和continue可以配合标签使用。

goto

语句用于函数的内部的跳转,需要配合标签一起使用,
goto语句可以无条件地转移到过程中指定的行。
通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱
goto对应(标签)既可以定义在for循环前面,也可以定义在for循环后面,当跳转到标签地方时,继续执行标签下面的代码。

  1. package main
  2. import "fmt"
  3. func main() {
  4. var a =0
  5. for ;a<5;a++{
  6. if a>3{
  7. goto Loop
  8. }
  9. fmt.Printf("for ...%d\n",a)
  10. }
  11. Loop: //放在for后边
  12. fmt.Printf("loop ...%d\n",a)
  13. }

打印结果

  1. for...0
  2. for...1
  3. for...2
  4. for...3
  5. loop...4

放在前面一直死循环

  1. package main
  2. import "fmt"
  3. func main() {
  4. var a =0
  5. Loop: //放在for前面 一直死循环
  6. fmt.Printf("loop ...%d\n",a)
  7. for ;a<5;a++{
  8. if a>3{
  9. goto Loop
  10. }
  11. fmt.Printf("for ...%d\n",a)
  12. }
  13. }

注意的是goto语句与标签之间不能有变量声明,否则编译错误。

  1. func foo(){
  2. goto flag
  3. var s = "hello world"
  4. fmt.Println(s)
  5. flag:
  6. s = "hello golang"
  7. fmt.Println(s)
  8. }
  1. # command-line-arguments
  2. ./goto.go:20:7: goto flag jumps over declaration of s at ./goto.go:21:6

break

break标签能用于循环,跳出后不再执行标签对应的循环体

  1. package main
  2. import "fmt"
  3. func main() {
  4. for i := 0; i <= 2; i++ {
  5. for j := 1; j <= 3; j++ {
  6. if j == 2 {
  7. break
  8. }
  9. fmt.Printf("%d+%d=%d\n", i, j, i+j)
  10. }
  11. }
  12. }

执行结果

  1. 0+1=1
  2. 1+1=2
  3. 2+1=3

break只是跳出了第一层for循环,使用标签后跳出到指定的标签,break只能跳出到之前,如果将Loop标签放在后边则会报错

  1. package main
  2. import "fmt"
  3. func main() {
  4. var a =0
  5. for ;a<5;a++{
  6. if a>3{
  7. goto Loop
  8. }
  9. fmt.Printf("for ...%d\n",a)
  10. }
  11. Loop: //放在for后边
  12. fmt.Printf("loop ...%d\n",a)
  13. }

打印结果

  1. 0+1=1

continue

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. FirstNames := []string{"张", "李", "王"}
  7. LastNames := []string{"三", "四", "五"}
  8. for i, firstName := range FirstNames {
  9. for j, lastName := range LastNames {
  10. if i == 1 && j==1 {
  11. continue
  12. }
  13. fmt.Printf("%d-%d:%s%s\n",i,j, firstName, lastName)
  14. }
  15. }
  16. }

打印结果

  1. 0-0:张三
  2. 0-1:张四
  3. 0-2:张五
  4. 1-0:李三
  5. 1-2:李五
  6. 2-0:王三
  7. 2-1:王四
  8. 2-2:王五
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. FirstNames := []string{"张", "李", "王"}
  7. LastNames := []string{"三", "四", "五"}
  8. Loop:
  9. for i, firstName := range FirstNames {
  10. for j, lastName := range LastNames {
  11. if i == 1 && j==1 {
  12. continue Loop
  13. }
  14. fmt.Printf("%d-%d:%s%s\n",i,j, firstName, lastName)
  15. }
  16. }
  17. }
  1. 0-0:张三
  2. 0-1:张四
  3. 0-2:张五
  4. 1-0:李三
  5. 2-0:王三
  6. 2-1:王四
  7. 2-2:王五