GO语言的进阶之路-流程控制

                                           作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。流程控制语句有三个作用,第一,选择(根据条件跳转到不同的执行序列); 第二,循环(根据条件反复执行某个序列)第三,跳转(据条件返回到某执行序列)。

一.流程控制语句类型

  Go语言支持如下的几种流程控制语句:

  1>.条件语句:关键字为if、else和else if。

  2>.选择语句:关键字为switch、case和select。

  3>.循环语句:关键字为for和range。

  4>.跳转语句:关键字为goto。

  在具体的应用场景中,为了满足更丰富的控制需求,Go语言还添加了如下关键字: break 、 continue 和 fallthrough 。

二.各个流程控制案例展示

1.条件语句

a>.单分支结构

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package main import "fmt" func main() {
Name := "yinzhengjie"
if Name == "yinzhengjie" {
fmt.Println("His Chinese name is 尹正杰")
}else {
fmt.Println("He is not yinzhengjie!")
}
} #以上代码执行结果如下:
His Chinese name is 尹正杰

b>.多分支结构

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package main import "fmt" func AcademicRecords(x int64) {
if >=x && x> { //可以定义一个条件。
fmt.Println("优秀!")
}else if >=x && x> { //可以定义另一个条件。
fmt.Println("较优")
}else if >=x && x>{ //也可以在定义一个条件,它不局限于定义两个条件。
fmt.Println("良好")
}else if >=x && x> {
fmt.Println("一般")
}else {
fmt.Println("你娃娃得努力啦!")
}
} func main() {
AcademicRecords() //调用该函数
AcademicRecords()
AcademicRecords()
AcademicRecords()
AcademicRecords()
} #以上代码执行结果如下:
优秀!
较优
良好
一般
你娃娃得努力啦!

2.选择语句

a>.switch姿势一

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" func MyPrint(n int) {
switch n { //有没有发现他和shell的case语句很像
case 0:
fmt.Printf("这是第【%d】种情况,它输入的值为:%v\n",n,"first")
case 1:
fmt.Printf("这是第【%d】种情况,它输入的值为:%v\n",n,"Second")
case 2:
fallthrough //表示跳过当前的case,直接执行下一个case。
case 3:
fmt.Printf("这是第【%d】种情况,它输入的值为:%v\n",n,"fourth")
case 4, 5, 6:
fmt.Printf("这是第【%d】种情况,它输入的值为:%v\n",n,"Fifth to seventh")
default:
fmt.Printf("这是第【%d】种情况,它输入的值为:%v\n",n,"默认情况")
}
} func main() {
for i:=0;i<10 ;i++ {
MyPrint(i) //接下来我们就需要去调用问你定义的函数啦。
}
} #以上代码执行结果如下:
这是第【0】种情况,它输入的值为:first
这是第【1】种情况,它输入的值为:Second
这是第【2】种情况,它输入的值为:fourth
这是第【3】种情况,它输入的值为:fourth
这是第【4】种情况,它输入的值为:Fifth to seventh
这是第【5】种情况,它输入的值为:Fifth to seventh
这是第【6】种情况,它输入的值为:Fifth to seventh
这是第【7】种情况,它输入的值为:默认情况
这是第【8】种情况,它输入的值为:默认情况
这是第【9】种情况,它输入的值为:默认情况

b>.switch姿势二

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" func AcademicRecords(n int) {
switch { //有没有发现他和shell的case语句很像
case 100>=n && n > 90:
fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】\n",n,"优秀")
case 90>=n && n>80 :
fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】\n",n,"良好")
case 80>=n && n>70:
fallthrough //表示跳过当前的case,直接执行下一个case。
case 70>=n && n>60:
fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】\n",n,"一般")
default:
fmt.Printf("你当前的分数是:【%d】,获得的评价是【%v】\n",n,"你娃娃得努力啦!")
}
} func main() {
for i:=45;i<100 ;i=i+10 { //为了看到实验效果,我这里定义的步长为10,一会我们会说到这个函数。
AcademicRecords(i)
}
} #以上代码执行结果如下:
你当前的分数是:【45】,获得的评价是【你娃娃得努力啦!】
你当前的分数是:【55】,获得的评价是【你娃娃得努力啦!】
你当前的分数是:【65】,获得的评价是【一般】
你当前的分数是:【75】,获得的评价是【一般】
你当前的分数是:【85】,获得的评价是【良好】
你当前的分数是:【95】,获得的评价是【优秀】

c>.channel的select语句

  其实select的语法格式和switch语法格式类似,只不过select是专用于channel的流程控制语句,属于特殊的流程控制语句,此处我们了解即可,感兴趣的小伙伴可以看我关于channel的笔记。

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" func main() {
ch1 := make (chan int, 100) //定义名称为ch1的一个channel,其类型为int,其容量为100。
ch2 := make (chan string,50) //定义名称为ch2的一个channel,其类型为string,其容量为50。
select {
case <-ch1: //我们只是定义了一个channel,但是还没有往里面传值,因此,该ch1和下面的ch2都是空的。
fmt.Println("ch1 pop one hundred element")
case <-ch2:
fmt.Println("ch2 pop one hundred element")
default: //由于上面两个channel都是空的,因此只会默认走这条语句
fmt.Println("default")
}
} #以上代码执行结果如下:
default

3.循环语句

  在Golang语言中,只存在for循环语句,没有类似Python中的while循环,也没有shell中的until循环等等。

a>.for循环姿势一,普通循环;

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" func main() {
var StartNumber int64
for StartNumber = 11;StartNumber < 100 ;StartNumber += 11 { //定义起始的数字是11,结束的条件是小于100,每次循环都得加11.
fmt.Println(StartNumber) //强每次循环都打印出来。
}
} #以上代码执行结果如下:
11
22
33
44
55
66
77
88
99

b>.for循环姿势二,模拟while循环;

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" var (
Sum int
) func main() {
Sum = 1
for Sum < 100 { //此处模拟的就是Python中的while循环,它其实是普通循环演变而来的。只不过我们只去啦普通循环的结束条件。
fmt.Println(Sum)
Sum += Sum
}
fmt.Println(Sum)
} #以上代码执行结果如下:
1
2
4
8
16
32
64
128

c>.for循环姿势三,数组循环;

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import (
"fmt"
) func main() {
dict := make(map[string]int)
NameList := []string{"尹正杰","饼干","Golang"}
IdList := []int{100,200,300} for id,name := range NameList{ //基于数组的方式循环。
dict[name] = IdList[id]
}
fmt.Println(dict) for k,v :=range dict{
fmt.Println(k,v)
}
} #以上代码执行结果如下:
map[饼干:200 Golang:300 尹正杰:100]
Golang 300
尹正杰 100
饼干 200

d>.for循环姿势四,死循环;

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import (
"bufio"
"os"
"fmt"
) var (
UserInput string
line string
)
func main() {
f := bufio.NewReader(os.Stdin) //读取输入的内容
for { //以下的内容就是死循环了,但是可以用continue和break来控制循环。
fmt.Print("请输入一些字符串>")
line,_ = f.ReadString('\n') //定义一行输入的内容分隔符。
if len(line) == 1 {
continue //如果用户输入的是一个空行就跳过本次循环,让用户继续输入。
}
fmt.Sscan(line,&UserInput) //将从系统标准输入读取的内容按行(line)传给变量UserInput。
if UserInput == "stop" {
fmt.Println("程序已结终止!")
break //当用户输入“stop”就跳出当前的for循环,从而使得整个程序结束。
}
fmt.Printf("您输入的参数是:·\033[31;1m%v\033[0m·\n",UserInput)
}
} #以上代码执行结果如下:
请输入一些字符串>尹正杰
您输入的参数是:·尹正杰·
请输入一些字符串>ls
您输入的参数是:·ls·
请输入一些字符串>pwd
您输入的参数是:·pwd·
请输入一些字符串>stop
程序已结终止!

4.跳转语句

 /*
#!/usr/bin/env gorun
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/ package main import "fmt" func MyEcho() {
StartNumber := 0
Stop:
fmt.Println(StartNumber)
StartNumber += 100
if StartNumber < 500 {
goto Stop //表示当代码执行到这一行时,跳转到关键字“Stop”这行代码上去。这个“Stop”关键字其实你可以随意定义哟!
}
} func main() {
MyEcho()
} #以上代码执行结果如下:
0
100
200
300
400

三.小时牛刀

1.编写九九乘法表

 package main

 import "fmt"

 func main() {
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d x %d = %-2d ",i,j,i*j)
}
fmt.Println()
}
} #以上代码执行结果如下:
1 x 1 = 1
2 x 1 = 2 2 x 2 = 4
3 x 1 = 3 3 x 2 = 6 3 x 3 = 9
4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16
5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25
6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36
7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49
8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64
9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81

GO语言的进阶之路-流程控制的更多相关文章

  1. GO语言的进阶之路-goroutine(并发)

    GO语言的进阶之路-goroutine(并发) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 有人把Go比作21世纪的C 语言,第一是因为 Go语言设计简单,第二,21世纪最重要的 ...

  2. GO语言的进阶之路-协程和Channel

    GO语言的进阶之路-协程和Channel 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 看过我之前几篇博客小伙伴可能对Golang语言的语法上了解的差不多了,但是,如果想要你的代码 ...

  3. GO语言的进阶之路-初探GO语言

    GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...

  4. Scala进阶之路-进程控制之执行shell脚本

    Scala进阶之路-进程控制之执行shell脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,我这里直接放一个案例. /* @author :yinzhengjie ...

  5. GO语言的进阶之路-网络安全之proxy

    GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...

  6. GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

  7. GO语言的进阶之路-爬虫进阶之路

    GO语言的进阶之路-爬虫进阶之路 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分.我们今天要介绍的就是一个简单的网络爬 ...

  8. GO语言的进阶之路-面向对象编程

    GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看 ...

  9. GO语言的进阶之路-面向过程式编程

    GO语言的进阶之路-面向过程式编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们在用Golang写一个小程序的时候,未免会在多个地方调用同一块代码,这个时候如何优化你的代码呢 ...

随机推荐

  1. Python学习笔记 ---第三章

    函数 函数是代码的一种抽象 函数 说明 abs 绝对值 max 最大值 hex 转换为16进制 强制数据类型转换 int('123') 123 int(12.35) 12 srt(100) '100' ...

  2. T-shirt 0 0....

    老师给我这件T-shirt的目的是为了让我减肥吗...... 听说了pbb的事迹好感动 //偷偷吐槽一句,那个全套吉米多维奇可以报销吗...我就看了2行........ 吓得我赶紧看了一下浴盆的气球

  3. Vector,ArrayList, LinkedList的区别

    1.Vector.ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储. 2.List中的元素有序.允许有重复的元素,Set中的元素无序.不允许有重复元素. ...

  4. Jenkins Git Changelog Plugin

    https://wiki.jenkins.io/display/JENKINS/Git+Changelog+Plugin

  5. Postgresql 密码设置

    今天下午 陷进去了 其实很简单的一个事情结果浪费了 接近一个小时. 做事情必须要细致一些. 自己的确做的不好. 这里面简单说一下pg_hba.conf 和 postgresql 密码的一些设置问题. ...

  6. MongoDb在windows10下的安装、创建用户和数据库

    1.mongodb下载地址https://www.mongodb.com/download-center#community 2.安装    3.在D:\MongoDB目录下创建db和log两个文件夹 ...

  7. CSS 选择器继承和层叠

    CSS选择器及其继承特性.层叠特性1.基本选择器  标记  id  class  这个就不再作介绍了 2.复合选择器  交集 交集选择器由两个选择器直接连接构成,其结果是选中二者各自元素范围的交集 其 ...

  8. Maven- 自动导入包的方法-很多没有导入的类,如何处理

    (1) 比如在pom.xml文件里面引入了类,但是在java中使用这个类的时候,还是报错,那就点击Maven.projects的 左上角的刷新的按钮: (2) 在Maven项目的时候,发现很多的类没有 ...

  9. js 单项链表

    介绍链表 链表是由一组节点组成的集合.每一个节点都使用一个对象的引用指向它的后续借点.指向另外一个借点的引用叫做链. 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组 ...

  10. LOJ116 有源汇有上下界最大流(上下界网络流)

    考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...