【Go语言】【9】GO语言的循环语句

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://qingkechina.blog.51cto.com/5552198/1618407

一、循环语句

    循环语句即for语句,您可能说:“不对,它不仅仅是for语句,还有while或者do-while”,真的很遗憾,GO语言真的只有for,它认为提供一种就可以了,提供多了怕给程序员带来麻烦 :)

下面我们使用for循环计算1+2+3+4+……+100的和,和其它语言一样,我们使用循环100次的办法:

定义一个变量,让它从1开始循环100次,每次都判断它是否小于101,若是变量就加1

代码如下:

// 声明变量sum并初始化为0

sum := 0

// 定义变量i,循环100次,每次判断是否小于101

for i:= 1; i< 101; i++{

   // 累加总和

   sum += i

}

// 打印结果

fmt.Println("sum=", sum)

结果如下图:

wKioL1T7EDigDGZsAAA_GdFb3Wk125.jpg


1、习惯的养成

若您一直使用C/C++/Java开发的话,此时您可能会说:“for循环与if一样,后面没有括号,真不习惯”,是的,一开始真不习惯,等您写上30遍之后就习惯了j_0059.gif


2、上例变形

有的语言不允许在for后面定义变量,那么上例就可以变形为

sum, i := 0, 1

for i < 101 {

    sum += i

    i++

}

fmt.Println("sum=", sum)

把for后面的变量i定义移至for的上面,i自增加放到for循环体内部,for后面只用于条件判断


3、无限循环

既然GO语言去除了while关键字,哪么怎么表达无限循环呢?秘密就是for后面什么表达式都不带

sum, i := 0, 1

for {

    if i > 100 {

        break

    }

    sum += i

    i++

}

fmt.Println("sum=", sum)

既然for后面无任何条件表达式了,但总不能让CPU一直跑下去构成死循环吧,所以这里使用了break关键字,当条件满足时break可以从当前for循环跳出来


二、range遍历

对于一篇博客文章来说,它有ID(blogId)、标题(blogTitle)、内容(blogContent)、发表日期(blogDate)等组成,假如这些信息都放在一个字符串数组中:

blog := []string{"blogId", "blogTitle", "blogContent", "blogDate"}

那么我们怎么遍历这个数组呢?使用循环语句是我们最常用,同时也是最先想到的:

for i := 0; i < len(blog); i++ {

    fmt.Printf("%s\t", blog[i])

}


若读者对JavaScript脚本熟悉的话,应该知道有一个each遍历用法:

$.each(blog, function(i, item){

    /* 这里的i为blog数组的索引,item为blog数组索引对应的值,例如当i值为1时,item的值为blogTitle */

    alert("i = " + i + ", value = " + item)

});

客户端脚本的程序员是非常钟爱这个遍历用法的,所幸GO语言也提供了类似用法:range,它和for关键字一块用于对数组、切片、字符串和map遍历。现在使用range把上面的遍历重写一下:

for i, value := range blog {

   fmt.Println("索引", i, "对应的值为", value)

}

运行结果:

wKioL1T8J8OivANYAACOUEymqdQ071.jpg


管中窥豹,可见一斑,GO语言将很多语言的优点内置到自身里面,这也是为何在《【3】GO语言常量》中说到:“刚开始接触GO,感觉它就是一个大杂烩,有很多语言的影子”的原因 :)


三、跳转语句

    使用循环时常伴随着break、continue、goto关键字,是的,您没有看错,goto关键字在GO语言中得到了重用,早些年刚接触编程时,有经验的程序员总是谆谆教导:“能不用goto的就不要用goto”,所以很多语言总是在刻意回避goto,但在惜关键字如金的GO语言中,goto又熠熠生辉起来。


下面使用goto关键字重写1+2+3+4+……+100的循环例子:

wKiom1T8KvvQYpvcAAJKEzzrYF4904.jpg

先是定义了一个索引变量i和求和变量sum,然后定义了一个标签MYBOWL(快到我的碗里来j_0069.gif),然后判断索引变量i是否到了101,若没有到则sum值就加i,再i++,然后再跳转到MYBOWL;当条件不满足之后(即i到了101)就输出1到100的总和


【备注】:

1、GO语言没有++i,只有i++

还是那句话,GO语言认为一种方法能把问题解决就不用提供第二种方法了


2、标签的作用域

上例中MYBOWL是一个标签,它的作用域包括

if i < 101 {

    sum += i

    i++

    goto MYBOWL

}

但不包括fmt.Println("sum=",sum),否则就会输出100次"sum="


四、练习题

1、请问该程序的输出结果是多少?

for {

    for i := 0; i < 5; i++ {

        if i > 3 {

            fmt.Println("i=", i)

            break

        }

    }

}

答案:

死循环。由于break只是跳出当前层的循环,所以当i=4时break可以使程序跳出for i:=0; i<5;i++{}这层循环,但跳不出第一层for{}这个无限循环。


2、请问该程序的输出结果是多少?

MYBOWL:

    for {

        for i := 0; i < 5; i++ {

            if i > 3 {

                fmt.Println("i=", i)

break

            }

        }

    }

该程序与上面程序1类似,只是增加了一个标签MYBOWL,那么这个程序会怎么样呢?

答案:

wKiom1T8OGyz-LRxAABqtys9jlg502.jpg

我们把MYBOWL标签及for{}无限循环看作第一层循环,for i:=0;i<5;i++{}看作第二层循环,当i为4时条件语句满足,执行break跳出第二层循环进入第一层循环,由于第一层循环是无限循环,所以这里是死循环,与MYBOWL标签没有任何关系。

3、请问该程序的输出结果是多少?

MYBOWL:

    for {

        for i := 0; i < 5; i++ {

            if i > 3 {

                fmt.Println("i=", i)

break MYBOWL

            }

        }

    }

该程序与程序2不同之外仅在于break语句

答案:

输出i=4

原因是由于当i=4时条件语句满足,输出i=4后执行break语句,这里的break后面添加了标签MYBOWL,这也意味着是跳出MYBOWL标签,而MYBOWL标签是第一层循环,所以程序可以结束。


结束语:

要想熟悉一门语言,最重要的是用该语言写应用程序,多写就能多体会,熟能生巧 :)

本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1618407

目录
相关文章
|
17天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
7天前
|
关系型数据库 Go API
《Go 简易速速上手小册》第1章:Go 语言基础(2024 最新版)(上)
《Go 简易速速上手小册》第1章:Go 语言基础(2024 最新版)(上)
37 1
|
4天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
23天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
1天前
|
安全 Go 开发者
Golang深入浅出之-Go语言并发编程面试:Goroutine简介与创建
【4月更文挑战第22天】Go语言的Goroutine是其并发模型的核心,是一种轻量级线程,能低成本创建和销毁,支持并发和并行执行。创建Goroutine使用`go`关键字,如`go sayHello(&quot;Alice&quot;)`。常见问题包括忘记使用`go`关键字、不正确处理通道同步和关闭、以及Goroutine泄漏。解决方法包括确保使用`go`启动函数、在发送完数据后关闭通道、设置Goroutine退出条件。理解并掌握这些能帮助开发者编写高效、安全的并发程序。
10 1
|
1天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
1天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
2天前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
11 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
2天前
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
16 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
3天前
|
程序员 Go API
【Go语言快速上手(二)】 分支与循环&函数讲解
【Go语言快速上手(二)】 分支与循环&函数讲解