golang switch语句的灵活写法介绍


Posted in Golang onMay 06, 2021

switch是很容易理解的,先来个代码,运行起来

看看你的操作系统是什么吧

package main 
import (
    "fmt"
    "runtime"
)
 
func main() {
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        fmt.Printf("%s", os)
    }
}

runtine运行时获取当前的操作系统,使用GOOS。还和if for之类的习惯一样,可以在前面声明赋值变量。我们就在这里来获取操作系统的信息了。

os := runtime.GOOS;

{}里的case比较容易理解。操作系统是 "darwin" 就打印"OS X.";操作系统是 "linux" 就打印"Linux";其他的都直接打印系统类别。

在go语言的switch中除非以fallthrough语句结束,否则分支会自动终止。

所以修改一下上面的代码,再运行一下:

package main 
import (
    "fmt"
    "runtime"
)
 
func main() {
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    case "windows":
        fmt.Println("win")
        fallthrough
    default:
        fmt.Printf("%s", os)
    }
}

增加了当前的系统的case选项"windows",还在这个分支使用了fallghrough。

如果你再注释掉 fallthrough,或干脆删除 fallthrough,再运行,就会发现,那个穿透的效果没有了。

总结

switch 的条件从上到下的执行,当匹配成功的时候停止。如果匹配成功的这个分支是以fallthrough结束的,那么下一个紧邻的分支也会被执行。

switch的没有条件的用法。这其实相当于switch true一样。每一个case选项都是bool表达式,值为true的分支就会被执行,或者执行default。

package main 
import (
    "fmt"
    "time"
)
 
func main() {
    t := time.Now()
    switch  {
    case t.Hour() > 12:
        fmt.Println("Morning was passed.")
    case t.Hour() > 17:
        fmt.Println("Afternoon was passed.")
    default:
        fmt.Println("Now too early.")
 
    }
}

补充:记Golang switch的一个“坑”

switch分支语句在各个编程语言中都很常用,能够根据条件选中一个或多个case语句进行执行,习惯于C、C++语言编程的都知道,在C、C++中switch分支判断条件会依次遍历每个case,当遇到符合条件的case时,便会执行该case中的语句,直到遇到case中显示的break语句才会终止switch流程,如果一个case中没有显示的break此case,程序便会执行下一个case(如果存在的话)。

对于从C、C++刚转到Go语言的程序员来说,这里面便存在一个“坑”,本人在开发过程中也踩过这个“坑”,那便是Go语言在switch分支语句的每个case中会自动加上一个break语句,也就是说在Go语言中程序进入了一个case流程,不管程序中有没有显示的break此case,程序都不会继续执行其他的case流程,而是直接退出整个switch流程,这里做一个简单的实验。

显示的在每个case中添加上break语句:

package main
import "fmt"
func main() {
    var num = 10
    switch num {
    case 5:
        fmt.Println("num is 5")
        break
    case 10:
        fmt.Println("num is 10")
        break
    case 15:
        fmt.Println("num is 15")
        break
    default:
        fmt.Println("num is default branch")
    }
    return
}

程序的运行结果如下:

num is 10

下面去掉每个case中显示的break语句,看看结果是什么呢。

package main
import "fmt"
func main() {
    var num = 10
    switch num {
    case 5:
        fmt.Println("num is 5")
    case 10:
        fmt.Println("num is 10")
    case 15:
        fmt.Println("num is 15")
    default:
        fmt.Println("num is default branch")
    }
    return
}

程序的运行结果如下:

num is 10

很明显,在每个case语句中是否显示的添加break语句都只会执行其中的一个分支流程,这对于想要通过break来控制每次执行case数量的程序员来说确实是一个不大不小的“坑”。

Golang 相关文章推荐
go语言map与string的相互转换的实现
Apr 07 Golang
Golang二维切片初始化的实现
Apr 08 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
golang 语言中错误处理机制
Aug 30 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang bufio详细讲解
Apr 21 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
go语言中fallthrough的用法说明
Golang之sync.Pool使用详解
May 06 #Golang
Golang 编译成DLL文件的操作
May 06 #Golang
完美解决golang go get私有仓库的问题
May 05 #Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 #Golang
go类型转换及与C的类型转换方式
May 05 #Golang
Golang: 内建容器的用法
May 05 #Golang
You might like
html中select语句读取mysql表中内容
2006/10/09 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php中error与exception的区别及应用
2014/07/28 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
python中的set实现不重复的排序原理
2018/01/24 Python
Python底层封装实现方法详解
2020/01/22 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
初中生自我评价
2014/02/01 职场文书
大学新学期计划书
2014/04/28 职场文书
党员自我对照检查材料
2014/08/19 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
安全伴我行主题班会
2015/08/13 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
2016年记者节感言
2015/12/08 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android