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 相关文章推荐
golang DNS服务器的简单实现操作
Apr 30 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Golang的继承模拟实例
Jun 30 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang的文件创建及读写操作
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang解析JSON对象
Apr 30 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
Go结合Gin导出Mysql数据到Excel表格
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
php 实现进制相互转换
2016/04/07 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
php函数式编程简单示例
2019/08/08 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
Vue-Router的使用方法
2018/09/05 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
大学生感恩父母演讲稿
2014/08/28 职场文书
工程部部长岗位职责
2015/02/12 职场文书
先进工作者个人总结
2015/02/15 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫