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 interface判断为空nil的实现代码
Apr 24 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Golang 字符串的常见操作
Apr 19 Golang
深入理解 Golang 的字符串
May 04 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 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 header函数使用教程
2013/09/05 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
jquery.validate使用攻略 第二部
2010/07/01 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
node内置调试方法总结
2018/02/22 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
详解Python中的文本处理
2015/04/11 Python
Python如何判断数独是否合法
2016/09/08 Python
Python实现全角半角字符互转的方法
2016/11/28 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Python何时应该使用Lambda函数
2019/07/02 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python输出带颜色字体实例方法
2019/09/01 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
营销人才自我鉴定范文
2013/12/25 职场文书
无毒社区工作方案
2014/05/23 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技