分支循环

在编写 Go 程序的时候,我们不仅会用前面学到的数据结构来存储数据,还会用到 ifswitchfor 来进行条件判断和流程控制,今天我们就来一起学习下它们。

if

if 主要用于条件判断,语法为:

  1. if 条件 {
  2. # 业务代码
  3. }

先看一个简单例子:

  1. package main
  2. import "fmt"
  3. func main() {
  4. age := 7
  5. if age > 6 {
  6. fmt.Println("It's primary school")
  7. }
  8. }

我们可以在条件中使用 &|| 来进行组合判断:

  1. package main
  2. import "fmt"
  3. func main() {
  4. age := 7
  5. if age > 6 && age <= 12 {
  6. fmt.Println("It's primary school")
  7. }
  8. }

我们还可以使用 if..else if..else 来实现多分支的条件判断:

  1. package main
  2. import "fmt"
  3. func main() {
  4. age := 13
  5. if age > 6 && age <= 12 {
  6. fmt.Println("It's primary school")
  7. } else if age > 12 && age <= 15 {
  8. fmt.Println("It's middle school")
  9. } else {
  10. fmt.Println("It's high school")
  11. }
  12. }

switch

如果我们的条件分支太多,可以考虑使用 switch 替换 if, 例如:

  1. package main
  2. import "fmt"
  3. func main() {
  4. age := 10
  5. switch age {
  6. case 5:
  7. fmt.Println("The age is 5")
  8. case 7:
  9. fmt.Println("The age is 7")
  10. case 10:
  11. fmt.Println("The age is 10")
  12. default:
  13. fmt.Println("The age is unkown")
  14. }
  15. }

注意:在 Go 中 switch 只要匹配中了就会中止剩余的匹配项,这和 Java 很大不一样,它需要使用 break 来主动跳出。

switchcase 条件可以是多个值,例如:

  1. package main
  2. import "fmt"
  3. func main() {
  4. age := 7
  5. switch age {
  6. case 7, 8, 9, 10, 11, 12:
  7. fmt.Println("It's primary school")
  8. case 13, 14, 15:
  9. fmt.Println("It's middle school")
  10. case 16, 17, 18:
  11. fmt.Println("It's high school")
  12. default:
  13. fmt.Println("The age is unkown")
  14. }
  15. }

注意: 同一个 case 中的多值不能重复。

switch 还可以使用 if..else 作为 case 条件,例如:

  1. package main
  2. import "fmt"
  3. func main() {
  4. age := 7
  5. switch {
  6. case age >= 6 && age <= 12:
  7. fmt.Println("It's primary school")
  8. case age >= 13 && age <= 15:
  9. fmt.Println("It's middle school")
  10. case age >= 16 && age <= 18:
  11. fmt.Println("It's high school")
  12. default:
  13. fmt.Println("The age is unkown")
  14. }
  15. }

小技巧: 使用 switchinterface{} 进行断言,例如:

  1. package main
  2. import "fmt"
  3. func checkType(i interface{}) {
  4. switch v := i.(type) {
  5. case int:
  6. fmt.Printf("%v is an in\n", v)
  7. case string:
  8. fmt.Printf("%v is a string\n", v)
  9. default:
  10. fmt.Printf("%v's type is unkown\n", v)
  11. }
  12. }
  13. func main() {
  14. checkType(8)
  15. checkType("hello, world")
  16. }

for

使用 for 来进行循环操作,例如:

  1. package main
  2. import "fmt"
  3. func main() {
  4. for i := 0; i < 2; i++ {
  5. fmt.Println("loop with index", i)
  6. }
  7. }

使用 for..range 对数组、切片、map、 字符串等进行循环操作,例如:

  1. package main
  2. import "fmt"
  3. func main() {
  4. numbers := []int{1, 2, 3}
  5. for i, v := range numbers {
  6. fmt.Printf("numbers[%d] is %d\n", i, v)
  7. }
  8. }

注意: 这里的 iv 是切片元素的位置索引和值。

  1. package main
  2. import "fmt"
  3. func main() {
  4. cityCodes := map[string]int{
  5. "北京": 1,
  6. "上海": 2,
  7. }
  8. for i, v := range cityCodes {
  9. fmt.Printf("%s is %d\n", i, v)
  10. }
  11. }

注意: 这里的 ivmap 的 一组键值对的键和值。

使用 continuebreak 对循环进行控制,例如:

  1. package main
  2. import "fmt"
  3. func main() {
  4. numbers := []int{1, 2, 3, 4, 5}
  5. for i, v := range numbers {
  6. if v == 4 {
  7. break
  8. }
  9. if v%2 == 0 {
  10. continue
  11. }
  12. fmt.Printf("numbers[%d] is %d\n", i, v)
  13. }
  14. }

注意:

  • break 会结束所有循环。
  • continue 会跳过当前循环直接进入下一次循环。