侧边栏壁纸
博主头像
微流 - 这里记录值得分享的内容

行动起来,活在当下

  • 累计撰写 16 篇文章
  • 累计创建 9 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
Go

Go:条件控制

本文介绍了 Golang 中存在的各种条件控制语句。

目录

目录1 If2 Switchfallthrough3 ForRangeContinueBreak注意事项

1 If

仅带判断条件

a := 10
if a > 20 {
    fmt.Println(">")
} else if a < 20 {
    fmt.Println("<")
} else {
    fmt.Println("=")
}

带语句的if

if _, err := doThing(); err != nil {
    fmt.Println("Uh oh")
}

2 Switch

x := 42.0
switch x {
  case 0:
  case 1, 2: // 匹配多个条件
      fmt.Println("Multiple matches")
  case 42:   // 不要 "fall through".
      fmt.Println("reached")
  case 43:
      fmt.Println("Unreached")
  default:
      fmt.Println("Optional")
}

fallthrough

通常情况下,在 switch 的一个 case 分支被执行后,控制流会退出整个 switch 语句。但是,使用 fallthrough 可以让控制流继续执行下一个 case 分支,即使当前分支的条件已经满足并且执行完成。

这里是一个简单的例子来展示 fallthrough 的用法:

switch {
case x == 1:
    fmt.Println("x is 1")
    fallthrough
case x == 2:
    fmt.Println("x is 2")
    fallthrough
case x == 3:
    fmt.Println("x is 3")
default:
    fmt.Println("x is not 1, 2, or 3")
}

3 For

i := 1
for i <= 3 {
  fmt.Println(i)
  i++
}
for i := 0; i <= 10; i++ {
  fmt.Println("i: ", i)
}

Range

Go 语言中的 for 循环结合 range 关键字可以用来迭代数组(array)、切片(slice)、字符串(string)、映射(map)等类型的数据。

它提供了简洁的方式来遍历这些集合类型的元素或键值对。

遍历切片:

nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
  sum += num
}

遍历map:

capitals := map[string]string{
    "Belgium": "Brussels",
    "Denmark": "Copenhagen",
}
​
for key, value := range capitals {
    fmt.Printf("The capital of %s is %s\n", key, value)
}

Continue

用于立即结束当前循环迭代,并开始下一次迭代。

// 打印从 1 到 10 的奇数
for i := 1; i <= 10; i++ {
    if i%2 == 0 {
        continue // 跳过偶数
    }
    fmt.Println(i)
}
  • 在嵌套循环中使用 continue 时,它只会结束最内层的循环的一次迭代。如果需要跳过外层循环的迭代,请考虑使用标签化的 for 循环和 break 语句。

标签化的 for 循环示例:

package main

import (
	"fmt"
)

func main() {
outerLoop:
	for i := 1; i <= 5; i++ {
		for j := 1; j <= 5; j++ {
			if j == 3 {
				continue outerLoop // 跳到外层循环的下一个迭代
			}
			fmt.Println(i, j)
		}
	}
}

在这个例子中,continue outerLoop 使得当 j 等于 3 时,跳过内层循环的当前迭代,并继续执行外层循环的下一个迭代。

Break

break 语句用于立即终止当前循环的执行,并将控制权交还给循环之后的代码。break 可以用于 for、while 和 switch 语句中。

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // 当 i 等于 5 时,跳出循环
        }
        fmt.Println(i)
    }
    fmt.Println("Loop ended.")
}

注意事项

  • 当遍历映射时,元素的顺序是不确定的,所以不应该依赖于特定的顺序。

  • 对于只读操作,可以使用 _ 作为占位符来忽略不需要的索引或键。

  • 不要在遍历的同时修改 slice 或 map 的容量。如通过 append 操作,可能导致 for...range 循环的行为不符合预期,如果在循环中增加元素,新的元素也会被访问到,这可能会导致循环次数超过最初的预期;而如果你删除元素,索引可能跳过后续的元素。

  • range 返回的元素是指针。虽然 range 返回的元素看起来像是值类型,但实际上它们是指向 slice 底层数组的指针。因此,如果 slice 被重新分配(如通过 append 或重新分配新 slice),原来的指针可能会失效。

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区