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 Gin实现文件上传下载的示例代码
Apr 02 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang 实现时间戳和时间的转化
May 07 Golang
golang中的并发和并行
May 08 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Go获取两个时区的时间差
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
Go语言测试库testify使用学习
Jul 23 Golang
基于Python实现西西成语接龙小助手
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数组(array)输出的三种形式详解
2013/06/05 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
Python break语句详解
2014/03/11 Python
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python中的filter()函数的用法
2015/04/27 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
初中班主任评语
2014/04/24 职场文书
投标承诺书怎么写
2014/05/24 职场文书
供电工程专业求职信
2014/08/09 职场文书
建国大业观后感800字
2015/06/01 职场文书
初中班主任工作随笔
2015/08/15 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
Python first-order-model实现让照片动起来
2022/06/25 Python