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 26 Golang
Go语言中的UTF-8实现
Apr 26 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Go获取两个时区的时间差
Apr 20 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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学习笔记(三)操作符与控制结构
2011/08/06 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP内核探索:变量概述
2014/01/30 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
微信支付扫码支付php版
2016/07/22 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
php中yii框架实例用法
2020/12/22 PHP
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
python字典排序实例详解
2015/05/20 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Django发送邮件功能实例详解
2019/09/02 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
四年的大学生生活自我评价
2013/12/09 职场文书
详解MySQL的半同步
2021/04/22 MySQL
日元符号 ¥
2022/02/17 杂记
Go语言grpc和protobuf
2022/04/13 Golang
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python