【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)

结果如下图:

1、习惯的养成

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

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)

}

运行结果:

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

三、跳转语句

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

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

先是定义了一个索引变量i和求和变量sum,然后定义了一个标签MYBOWL(快到我的碗里来),然后判断索引变量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,那么这个程序会怎么样呢?

答案:

我们把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

时间: 2025-01-01 13:43:48

【Go语言】【9】GO语言的循环语句的相关文章

Java语言----三种循环语句的区别介绍_java

第一种:for循环 循环结构for语句的格式:      for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体;   } eg: class Dome_For2{ public static void main(String[] args) { //System.out.println("Hello World!"); //求1-10的偶数的和 int sum = 0; for (int i = 1;i<=10 ; i++ ) { if (i%2 ==0) { //

c语言-求助一个java语言的一个for循环语句

问题描述 求助一个java语言的一个for循环语句 for(int i=2,j=1; j<10; i=(i==9)?(((++j)/j)+1):(i+1)){ System.out.printf("%d*%d=%2d%c",i,j,i*j, ((i==9)?'n':' ')); } 输出结果是99乘法表. 这个for循环里的++j为什么不能换成j+1啊? 谢谢各位了. 解决方案 ++j是改变变量值的 j+1是不改变变量值的 解决方案二: ++j 等效于j=j+1 你用j+1 原j

编程-c语言循环语句问题 输出不了结果

问题描述 c语言循环语句问题 输出不了结果 完全数是其各因子之和正好等于本身的数,如6=1+2+3,28=1+2+4+7+14,所以6,8都是完全数,请编程找出2-20000内的所有完全数.输入整数n,输出第n个完全平方数. 我的程序无法输出结果不知为啥 #include <stdio.h> void main() { int i,n,s=0,k=0; scanf("%d",&n); for(i=2;i<=20000;i++,s=0) { for(int j=

c语言-用循环语句能减小C语言代码尺寸吗

问题描述 用循环语句能减小C语言代码尺寸吗 我在编译的时候,程序体积太大,编译不了,有什么具体的方法可以缩减代码尺寸. 解决方案 C 代码大小 1)变量名,函数名,尽量简单,清晰,不啰嗦 2)尽可能分割为多个文件,不要所有代码都写在一个文件里 3)函数调用,不论论是二进制代码空间,还是C代码文本文件空间,多数情况下,都比粘贴复制占用的要小 4)结构复杂的数据结构,不要一路. 下去,这样看着难受,敲键盘次数也多,代码也大 5)至于循环,3次以上的循环,代码通常要比复制粘贴3次要小

代码-我想问一下c语言循环语句的问题~

问题描述 我想问一下c语言循环语句的问题~ 这是我的代码 #include <stdio.h> void main() {int a,n=0,i,j,k,t; scanf("%d",&a); for(t=100;t<=999;t+=1) {i=t/100; j=t/10%10; k=t%10; if(i+j+k==7) n+=1; if(n==a) printf("%dn",t); } } 我使用了循环语句,但是结果出来很多数字 我不明白后

《C语言程序设计与实践(第2版)》——2.3 循环语句

2.3 循环语句 2.3.1 while循环语句 在例2-1中,针对每个x值求得对应y值均是以相同的方式计算,故可以用循环语句来重复产生各行输出,每行重复一次.这就是while循环语句的用途. while (x <= end) { ... } while循环语句的执行步骤如下:首先,测试圆括号中的条件.如果条件为真(x小于等于end),则执行循环体(花括号中的语句).其次,重新测试该条件,如果为真(条件仍然成立),则再次执行该循环体.当该条件测试为假(x大于end)时,循环结束,继续执行跟在该循

C++条件及循环语句的综合运用实例_C 语言

用下面公式求π的近似值.π/4≈1-1/3+1/5-1/7+-直到最后一项的绝对值小于10-7为止.根据给定的算法很容易编写程序如下: #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main( ) { int s=1; double n=1,t=1,pi=0; while((fabs(t))>1e-7) { pi=pi+t; n=n+2; s=-s;

C++中的while循环和for循环语句学习教程_C 语言

C++ while循环 while语句的一般形式如下: while (表达式) 语句 其作用是: 当指定的条件为真(表达式为非0)时,执行while语句中的内嵌语句.其流程图见下图. 其特点是:先判断表达式,后执行语句.while循环称为当型循环. 例:求1+2+3+-+100. #include <iostream> using namespace std; int main( ) { int i=1,sum=0; while (i<=100) { sum=sum+i; i++; }

快速学习C语言中for循环语句的基本使用方法_C 语言

对于某个特定任务我们可以采用多种方法来编写程序.下面这段代码也可以实现前面的温度转换程序的功能:#include <stdio.h> /*打印华氏温度-摄氏温度对照表*/ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); } 温度的下限.上限和步长都是常量, printf 函数的第三个参数必