本文介绍了 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),原来的指针可能会失效。
评论区