更改golang switch语句中的变量值


package main
import "fmt"
func main() {
var i int = 10
switch true {
case i < 20:
fmt.Printf("%v is less than 20n", i)
i = 100
fallthrough
case i < 19:
fmt.Printf("%v is less than 19n", i)
fallthrough
case i < 18:
fmt.Printf("%v is less than 18n", i)
fallthrough
case i > 50:
fmt.Printf("%v is greater than 50n", i)
fallthrough
case i < 19:
fmt.Printf("%v is less than 19n", i)
fallthrough
case i == 100:
fmt.Printf("%v is equal to 100n", i)
fallthrough
case i < 17:
fmt.Printf("%v is less than 17n", i)
}
}

输出:

10 is less than 20
100 is less than 19
100 is less than 18
100 is greater than 50
100 is less than 19
100 is equal to 100
100 is less than 17

这是预期的行为吗?

fallthrough语句将控制权转移到下一个case块的第一条语句。

fallthrough语句并不意味着继续评估下一个case的表达式,而是无条件地开始执行下一个case块。

引用fallthrough报表文档:

A";失败";语句将控制权转移到表达式"中的下一个case子句的第一个语句;开关";陈述

switch语句文档报价:

在case或default子句中,最后一个非空语句可能是一个(可能标记为(";失败";语句,指示控制应从此子句的末尾流到下一子句的第一个语句。否则控制流到"0"的末尾;开关";陈述

是的,正如icza所指出的。

如果你不想在第一个之后落在每个case块下,请删除fallthrough行(就像你不会在每个C/C++case块的末尾放一条break行一样。

而且,正如您在评论中所期望的那样,当达到switch()时会进行评估,之后,无论您是否更改i值,都不会在每个案例块上再次进行评估。

最新更新