Go中的流程控制

255 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

switch

方式1 switch expr {}

 // switch后跟一个变量, case后跟常量
 season := 1
 switch season {
    case 1:
       fmt.Println("现在是春天")
    case 2:
       fmt.Println("现在是夏天")
    case 3:
       fmt.Println("现在是秋天")
    case 4:
       fmt.Println("现在是冬天")
    default:
       fmt.Println("我不知道这是什么季节")
 }
 ​
 // 多值判断, 在每个case中也可以进行多个值的匹配
 switch season {
   case 1, 2:
   fmt.Println("充满生机")
   case 3, 4:
   fmt.Println("西风落叶")
   default:
   fmt.Println("啥都不是")
 }

方式2 switch {}

 // switch后没有值, case后跟条件判断
 score := 80
 switch {
 case score >= 90:
     fmt.Println("优秀")
 case score >= 80:
     fmt.Println("良好")
 case score >= 70:
    fmt.Println("及格")
 default:
    fmt.Println("不合格的分数")
 }

for

方式1

 /*
 格式
 for expr1; expr2; expr3 {}
 ​
 expr1: 一般初始化循环体中用到的变量, 指定初始值
 expr2: 一般进行条件的判断, 不满足条件的话, 循环结束
 expr3: 一般进行循环条件的修改
 */
 for i := 0; i < 10; i++ {
    fmt.Println(i * 10)
 }

方式2

 /*
 expr1: 一般用于条件判断, 条件不满足, 循环结束
 for expr1 {}
 ​
 一般在for语句外初始化变量
 在for循环体内进行条件的修改
 */
 i := 0
 for i < 10 {
    fmt.Println(float64(i) * (1.5))
    i++
 }

格式3

 /*
 for循环外面, 进行条件变量的初始化
 for循环内部, 进行条件的修改和判断
 条件不成立, 使用break跳出循环
 for {}
 */
 for {
    if i == 20 {
       break
    }
    fmt.Println(i)
    i++
 }

格式4

 /*
 for循环 多个条件的判断和修改
 */
 arr := []int {1, 2, 3, 4, 5}
 fmt.Println(arr)
 ​
 // 利用for循环和Go语言特性进行数组的翻转
 for i, j := 0, len(arr) - 1; i < j; i, j = i + 1, j - 1 {
    arr[i], arr[j] = arr[j], arr[i]
 }
 fmt.Println(arr)

ragne

 /*
 注意: range语句中遍历得到的值, 都是该集合中的副本
 对其的修改操作, 不会影响到原集合中的内容
 */
 // 遍历切片
 s := []int {1, 3, 5, 7}
 for i, v := range s {
    fmt.Println("元素位置: ", i, "元素值: ", v)
 }
 ​
 // 遍历map
 m := map[string]int {"shaosiming":18, "dasiming":20}
 for k, v := range m {
    fmt.Println("key: ", k, ", value: ", v)
 }
 ​
 // 遍历字符串
 str := "Hi, gopher"
 for i, c := range str {
    fmt.Println("字符所在位置: ", i, "字符: ", string(c))
 }

if

格式1 if expr {}

 if true {
    fmt.Println("你永远都是对的")
 }

格式2 if expr {} else {}

c := "女"
if c == "男" {
   fmt.Println("一起去打球!")
} else {
   fmt.Println("一起去看电影")
}

格式3 if expr1 {} else if expr2 {} else {}

weather := "夏天"
if weather == "春天" {
   fmt.Println("一起去踏青")
} else if weather == "夏天" {
   fmt.Println("一起去冲浪")
} else if weather == "秋天" {
   fmt.Println("一起去荡秋千")
} else if weather == "冬天" {
   fmt.Println("一起去滑雪")
} else {
   fmt.Println("我也不知道了")
}

break语句的使用

/*
不管何时何地, 跳出本层循环
也就是说当有两层循环时, 如果在内层循环使用了break, 只会跳出内层循环
*/
for i := 0; i < 10; i++ {
   fmt.Println("外层i的值: ", i)
   for j := 0; j < 10; j++ {
      if j == 5 {
         break
      }
      fmt.Println("内层j的值: ", j)
   }
}

continue语句的使用

/*
不管何时何地, 结束当前循环体中的语句执行
进入当前循环的下一次循环中
*/
for i := 0; i < 10; i++ {
   for j := 0; j < 10; j++ {
      // 不想打印3, 5的值
      if j == 3 || j == 5 {
         continue
      }
      fmt.Println("内层j的值为: ", j)
   }
   fmt.Println("外层i的值为: ~~~~~~", i)
}

标签的使用

// 防止程序的死循环
count := 0

// 标签名: 下面的程序代码, 可以选择跳转到这里
TAG:
   fmt.Println("执行for循环的次数: ", count)
   for i := 0; i < 5; i++ {
      // 当i的值=3的时候, 跳转到TAG这里, 再向下执行
      // 当跳转5次之后, 就不再跳转了
      if i == 3 && count < 5 {
         count ++
         goto TAG
      }
      fmt.Println(i)
   }

总结

Go中的switch语句也去掉了break的强制使用, case支持多值判断, 也简便了很多. Go中的for循环使用更加灵活, 没有明确的格式限制, 结合Go的平行赋值, 更好使用. Go中的range语句简直不要太方便, 我们可以轻轻松松遍历一个集合类型的数据.