golang的switch语句使用fallthrough

简介: 很多的教程在说明golang的switch时,都会特别指明,switch语句不会自动向下贯穿, 因此不必在每一个case子句的末尾都添加一个break语句,有些书本说明, 需要向下贯穿的时候, 显示调用fallthrough语句.对于有些人来说, 对于这句话的理解是: 当case语句匹配后, 显示调用fallthrough语句, 那么就会接着判断下一个case条件. 我之前就是这么理解的, 有些书也是这么理解, 并且这么举例的. 网上很多的教程, 也是错误的.《学习go语言》的p12:它不会匹配失败后自动向下尝试, 但是可以使用fallthrough 使其这样做。

很多的教程在说明golang的switch时,都会特别指明,switch语句不会自动向下贯穿, 因此不必在每一个case子句的末尾都添加一个break语句,有些书本说明, 需要向下贯穿的时候, 显示调用fallthrough语句.
对于有些人来说, 对于这句话的理解是: 当case语句匹配后, 显示调用fallthrough语句, 那么就会接着判断下一个case条件. 我之前就是这么理解的, 有些书也是这么理解, 并且这么举例的. 网上很多的教程, 也是错误的.
《学习go语言》的p12:
它不会匹配失败后自动向下尝试, 但是可以使用fallthrough 使其这样做。没有fallthrough:

switch i {
case 0: // 空的case 体
case 1:
f() // 当i == 0 时,f 不会被调用!
}

而这样:

switch i {
case 0: fallthrough
case 1:
f() // 当i == 0 时,f 会被调用!
}

事实上, 这样的理解是错误的。

《go web编程》的p56:
在第5行中,我们把很多值聚合在了一个 case 里面,同时,Go里面 switch 默认相当于每个 case 最后带有 break ,匹配成功后不会自动向下执行其他case,而是跳出整个 switch , 但是可以使用 fallthrough 强制执行后面的case代码。

integer := 6
switch integer {
case 4:
fmt.Println("The integer was <= 4")
fallthrough
case 5:
fmt.Println("The integer was <= 5")
fallthrough
case 6:
fmt.Println("The integer was <= 6")
fallthrough
case 7:
fmt.Println("The integer was <= 7")
fallthrough
case 8:
fmt.Println("The integer was <= 8")
fallthrough
default:
fmt.Println("default case")
}

上面的程序将输出

The integer was <= 6
The integer was <= 7
The integer was <= 8
default case

此书的说法和例子都没有错, 但不够直白, 象我这样看书不认真的人, 就错过了重点.

写得比较浅显直白的, 是《go 学习笔记》p26:
如需要继续下一分支,可使用 fallthrough,但不再判断条件。

x := 10
switch x {
case 10:
println("a")
fallthrough
case 0:
println("b")
}

输出:

a
b

runoob.com里的教程, 是写得最清楚明白的:
使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。

package main

import "fmt"

func main() {

    switch {
    case false:
            fmt.Println("1、case 条件语句为 false")
            fallthrough
    case true:
            fmt.Println("2、case 条件语句为 true")
            fallthrough
    case false:
            fmt.Println("3、case 条件语句为 false")
            fallthrough
    case true:
            fmt.Println("4、case 条件语句为 true")
    case false:
            fmt.Println("5、case 条件语句为 false")
            fallthrough
    default:
            fmt.Println("6、默认 case")
    }
}

以上代码执行结果为:

2、case 条件语句为 true
3、case 条件语句为 false
4、case 条件语句为 true

从以上代码输出的结果可以看出:switch 从第一个判断表达式为 true 的 case 开始执行,如果 case 带有 fallthrough,程序会继续执行下一条 case,且它不会去判断下一个 case 的表达式是否为 true。

让我庆幸的是, fallthrough很不常用, 所以我范了这么低级的理解错误, 这么多年也没有"翻车".

目录
相关文章
|
18天前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
20 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
8天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
40 0
|
1天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
33 6
Go语言学习12-数据的使用
|
3天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
3天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
14 0
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
4天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
4天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
5天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1