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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go 语言结构实例分析
Jul 04 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 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 调用远程url的六种方法小结
2009/11/02 PHP
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
详解Python中的__init__和__new__
2014/03/12 Python
深入理解Python 代码优化详解
2014/10/27 Python
详解Python中for循环是如何工作的
2017/06/30 Python
python实现汉诺塔算法
2021/03/01 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
Python Selenium截图功能实现代码
2020/04/26 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
python中判断文件结束符的具体方法
2020/08/04 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
历史学专业推荐信
2013/11/06 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
单位成立周年感言
2014/01/26 职场文书
家长给孩子的评语
2014/01/30 职场文书
揠苗助长教学反思
2014/02/04 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
找规律教学反思
2016/02/23 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL