换个语言学一下 Golang (6)——控制流程
Go语言的控制结构关键字只有if..else if..else
,for
和 switch
。
而且在Go中,为了避免格式化战争,对程序结构做了统一的强制的规定。看下下面的例子。
请比较一下A程序和B程序的不同之处
A程序
- package main
- import (
- "fmt"
- )
- func main() {
- fmt.Println("hello world")
- }
B程序
- package main
- import (
- "fmt"
- )
- func main()
- {
- fmt.Println("hello world")
- }
在上面的两个例子中只有A例的写法是对的。因为在Go语言中,强制了{}
的格式。如果我们试图去编译B程序,那么会发生如下的错误提示。
- syntax error: unexpected semicolon or newline before {
if..else if..else
用来判断一个或者多个条件,然后根据条件的结果执行不同的程序块。举个简单的例子。
- package main
- import (
- "fmt"
- )
- func main() {
- var dog_age =
- if dog_age > {
- fmt.Println("A big dog")
- } else if dog_age > && dog_age <= {
- fmt.Println("A small dog")
- } else {
- fmt.Println("A baby dog")
- }
- }
上面的例子判断狗狗的年龄如果(if)
大于10就是一个大狗;否则判断(else if)
狗狗的年龄是否小于等于10且大于1,这个时候狗狗是小狗狗。否则(else)
的话(就是默认狗狗的年龄小于等于1岁),那么狗狗是Baby狗狗。
在上面的例子中,我们还可以发现Go的if..else if..else语句的判断条件一般都不需要使用()
。当然如果你还是愿意写,也是对的。另外如果为了将某两个或多个条件绑定在一起判断的话,还是需要括号()
的。
比如下面的例子也是对的。
- package main
- import (
- "fmt"
- )
- func main() {
- const Male = 'M'
- const Female = 'F'
- var dog_age =
- var dog_sex = 'M'
- if (dog_age == && dog_sex == 'M') {
- fmt.Println("dog")
- }
- }
但是如果你使用Go提供的格式化工具来格式化这段代码的话,Go会智能判断你的括号是否必须有,否则的话,会帮你去掉的。你可以试试。
- go fmt test_bracket.go
然后你会发现,咦?!果真被去掉了。
另外因为每个判断条件的结果要么是true要么是false,所以可以使用&&
,||
来连接不同的条件。使用!
来对一个条件取反。
Go 的 if 还有一个强大的地方就是条件判断语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了,如下所示:
- package main
- import "fmt"
- func main() {
- if num := ; num < {
- fmt.Println(num, "is negative")
- } else if num < {
- fmt.Println(num, "has 1 digit")
- } else {
- fmt.Println(num, "has multiple digits")
- }
- }
运行结果:
switch
switch的出现是为了解决某些情况下使用if判断语句带来的繁琐之处。
例如下面的例子:
- package main
- import (
- "fmt"
- )
- func main() {
- //score 为 [0,100]之间的整数
- var score int =
- if score >= && score <= {
- fmt.Println("优秀")
- } else if score >= && score < {
- fmt.Println("良好")
- } else if score >= && score < {
- fmt.Println("一般")
- } else if score >= && score < {
- fmt.Println("及格")
- } else {
- fmt.Println("不及格")
- }
- }
在上面的例子中,我们用if..else if..else来对分数进行分类。这个只是一般的情况下if判断条件的数量。如果if..else if..else的条件太多的话,我们可以使用switch来优化程序。比如上面的程序我们还可以这样写:
- package main
- import (
- "fmt"
- )
- func main() {
- //score 为 [0,100]之间的整数
- var score int =
- switch score / {
- case :
- case :
- fmt.Println("优秀")
- case :
- fmt.Println("良好")
- case :
- fmt.Println("一般")
- case :
- fmt.Println("及格")
- default:
- fmt.Println("不及格")
- }
- }
关于switch的几点说明如下:
(1) switch的判断条件可以为任何数据类型。
- package main
- import (
- "fmt"
- )
- func main() {
- var dog_sex = "F"
- switch dog_sex {
- case "M":
- fmt.Println("A male dog")
- case "F":
- fmt.Println("A female dog")
- }
- }
(2) 每个case后面跟的是一个完整的程序块,该程序块不需要{}
,也不需要break结尾
,因为每个case都是独立的。
(3) 可以为switch提供一个默认选项default,在上面所有的case都没有满足的情况下,默认执行default后面的语句。
for
for用在Go语言的循环条件里面。比如说要你输出1…100之间的自然数
- package main
- import (
- "fmt"
- )
- func main() {
- var i int =
- for ; i <= ; i++ {
- fmt.Println(i)
- }
- }
在上面的例子中,首先初始化变量i为1,然后在for循环里面判断是否小于等于100,如果是的话,输出i,然后再使用i++来将i的值自增1。上面的例子,还有一个更好的写法,就是将i的定义和初始化也放在for里面。如下:
- package main
- import (
- "fmt"
- )
- func main() {
- for i := ; i <= ; i++ {
- fmt.Println(i)
- }
- }
在Go里面没有提供while关键字,如果你怀念while的写法也可以这样:
- package main
- import (
- "fmt"
- )
- func main() {
- var i int =
- for i <= {
- fmt.Println(i)
- i++
- }
- }
或许你会问,如果我要死循环呢?是不是for true
?呵呵,不用了,直接这样。
- package main
- import (
- "fmt"
- )
- func main() {
- var i int =
- for {
- fmt.Println(i)
- }
- }
如果你要是没写fmt.Println(i)会有错误
导入但未使用:“fmt”,防止你乱引用。
以上就是Go提供的全部控制流程了。
换个语言学一下 Golang (6)——控制流程的更多相关文章
- 换个语言学一下 Golang (12)——Web基础
一.web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢?对于普通的上网过程,系统其实是这样做的 ...
- 换个语言学一下 Golang (3)——数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- 换个语言学一下 Golang (1)
做技术的总是有些拗.这么多年一直在.net的框框里打转转.直到现在市场上.net工作越来越难找,项目越来越老才发现不做出改变不行了.就从学习Go开始吧. Go语言的特点 简洁.快速.安全 并行.有趣. ...
- 换个语言学一下 Golang (13)——Web表单处理
介绍 表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进 行数据的交互.对于以前开发过Web的用户来说表单都非常熟悉.表单是一个包含表单元素的区域.表单元素是允许用户在表 ...
- 换个语言学一下 Golang (11)——使用包和测试
Go天生就是为了支持良好的项目管理体验而设计的. 包 在软件工程的实践中,我们会遇到很多功能重复的代码,比如去除字符串首尾的空格.高质量软件产品的特点就是它的部分代码是可以重用的,比如你不必每次写个函 ...
- 换个语言学一下 Golang (5)——运算符
运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 下表 ...
- 换个语言学一下 Golang (4)——变量与常量
一.变量定义 所谓的变量就是一个拥有指定名称和类型的数据存储位置. //看一个例子 package main import ( "fmt" ) func main() { var ...
- 换个语言学一下 Golang (2)——基础语法
Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.比如下面的hello world就是由 6 个标记组成: 行分隔符 在 Go 程序中,一行代表一个语句结束.每个语句 ...
- 换个语言学一下 Golang(14) ——fmt包
Print() 函数将参数列表 a 中的各个参数转换为字符串并写入到标准输出中. 非字符串参数之间会添加空格,返回写入的字节数. func Print(a ...interface{}) (n int ...
随机推荐
- 我的node-webkit笔记
话不多说,直接上码: index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- 【转发】SqlServer数据库表生成C# Model实体类SQL语句
已知现有表T1 通过运行下面的sql即可,先配置表名. declare @TableName sysname = 'T1' declare @Result varchar(max) = ' /// & ...
- linux centos编译安装php7.3
php7.2的编译安装参考:https://www.cnblogs.com/rxbook/p/9106513.html 已有的之前编译的旧版本php: mv /usr/local/php /usr/l ...
- kotlin基础 尾递归
尾调用的重要性在于它可以不在调用栈上面添加一个新的堆栈帧——而是更新它,如同迭代一般. 尾递归因而具有两个特征: 调用自身函数(Self-called): 计算仅占用常量栈空间(Stack Space ...
- .netcore项目部署到linux的docker里后,速度异常的慢
.netcore项目部署到linux的docker里后,速度异常的慢,部署在iis下速度非常快. 特别是 接口里再调用其他接口,那速度绝对是蜗牛爬行的速度. 经过几个月的折腾,终于知道是什么问题了: ...
- 010-Spring aop 001-核心说明-拦截指定类与方法、基于自定义注解的切面
一.概述 面向切面编程(AOP)是针对面向对象编程(OOP)的补充,可以非侵入式的为多个不具有继承关系的对象引入相同的公共行为例如日志.安全.事务.性能监控等等.SpringAOP允许将公共行为从业务 ...
- github 被强了!太丧心病狂了!
github 不强了! github 不能访问了! github 打不开了! github 被封了... - ping 都 ping 不通, 本地 ping 不通, 服务器 ping 不通. - 本地 ...
- jzy3D从入门到弃坑_4尝试使用jzy3D1.0画图失败
jzy3D从入门到弃坑_4 尝试使用jzy3D1.0画图失败 觉得有用的话,欢迎一起讨论相互学习~Follow Me 记录一下使用jzy3D1.0失败 究其原因在于 本人才疏学浅,对于JAVA ope ...
- testng失败自动重试
使用的监听类有:IRetryAnalyzer.TestListenerAdapter.IAnnotationTransformer public class Retry implements IRet ...
- python对不同类型文件(doc,txt,pdf)的字符查找
python对不同类型文件的字符查找 TXT文件: def txt_handler(self, f_name, find_str): """ 处理txt文件 :param ...