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 实现英尺和米的简单单位换算方式
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
goland设置颜色和字体的操作
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
Golang入门之计时器
May 04 Golang
GoFrame框架数据校验之校验结果Error接口对象
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 面向对象实现代码
2009/11/11 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
浅析php学习的路线图
2013/07/10 PHP
php里array_work用法实例分析
2015/07/13 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
详解Python中for循环的使用
2015/04/14 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
Python易忽视知识点小结
2015/05/25 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
上课说话检讨书大全
2014/01/22 职场文书
端午节寄语2015
2015/03/23 职场文书
离婚答辩状范文
2015/05/22 职场文书
2016七夕情人节感言
2015/12/09 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
Python借助with语句实现代码段只执行有限次
2022/03/23 Python