Go语言开发-过程式编程-For循环语句

栏目: Go · 发布时间: 5年前

内容简介:Go语言支持两种for循环语句,for和for…range语句。语法如下:大括号是必需的,但是分号只有在可选的optionalPreStatement或optionalPostStatement语句存在时才需要;且这两个语句都必须是短声明语句。如果变量是在可选声明语句中创建的或需要获取range子句产生的值(如,使用:=运算符),则其作用域为整个for循环。for循环中的布尔表达式的值必须是bool类型的,因为Go语言并不会将非bool类型的值自动转换成bool类型的。(参见表2.3)。

5.3. for循环语句

Go语言支持两种for循环语句,for和for…range语句。语法如下:

for { // Infinite loop
        block
    }
    for booleanExpression { // While loop
        block
    }
    for optionalPreStatement; booleanExpression; optionalPostStatement {
        block
    }
    for index, char := range aString { // String per character iteration
        block
    }
    for index := range aString { // String per character iteration
        block // char, size := utf8.DecodeRuneInString(aString[index:])
    }
    for index, item := range anArrayOrSlice { // Array or slice iteration
        block
    }
    for index := range anArrayOrSlice { // Array or slice iteration
        block // item := anArrayOrSlice[index]
    }
    for key, value := range aMap { // Map iteration
        block
    }
    for key := range aMap { // Map iteration
        block // value := aMap[key]
    }
    for item := range aChannel { // Channel iteration
        block
    }
 

大括号是必需的,但是分号只有在可选的optionalPreStatement或optionalPostStatement语句存在时才需要;且这两个语句都必须是短声明语句。如果变量是在可选声明语句中创建的或需要获取range子句产生的值(如,使用:=运算符),则其作用域为整个for循环。

for循环中的布尔表达式的值必须是bool类型的,因为 Go 语言并不会将非bool类型的值自动转换成bool类型的。(参见表2.3)。

第二个for…range循环遍历了一个字符串并给出了字节偏移索引。对于一个7位ASCII字符串s,如果值为“XabYcZ”,产生的索引为0,1,2,3,4,5,但是对于一个UTF-8字符串s,如果值为“XαβYγZ”,则产生的索引为0,1,3,5,6,8。在大多数情况下,第一个遍历字符串的for…range循环语法比第二个更便捷。

对于非空的切片或数组,第三个for…range循环通过遍历该数组或切片并给出了索引位置从0到len(slice)-1的元素。该语法和第一个遍历数组或切片的for…range语法都是非常常用的。这两种语法也特别解释了为何在Go语言中很少使用for循环语句。

for…range循环可以以键值对的形式遍历映射中的元素,但是这种遍历是无序的。如果需要排序,其中一种解决方法是使用第二种语法,将键填充到一个切片中,并对该切片排序。在之前的章节中我们已经讲解过这种用法。另一种解决方法是使用一个有序数据结构,例如,一个有序的映射。

如果将上面的语法应用于一个空的字符串、数组、切片或映射,for循环将会安全的不执行任何操作,控制流会从后面的语句继续。

for循环可以使用break语句来终止,并继续执行for循环之后的语句,或者,如果break语句指定了一个label,则程序会继续执行拥有该label的最内层的for、switch或select语句。也可以通过使用一个continue语句来让程序继续从for循环的条件开始处或range子句处开始下一次遍历(或结束循环)。

我们已经讲解了多个使用for语句的例子,包括for…range循环、无限循环和普通的for循环,但是在Go程序中普通的for循环使用频率并不高,这是因为其他的循环往往更便捷。当然,在本书的后续章节包括本章后面的小节,我们将会介绍更多的关于for循环的例子。下面是一个小例子。

假设我们有一个二维切片(如,[][]int),并且想要查找一下该切片是否含有一个特定的值。这里我们有两种查找方法,他们都使用了第二中for…range循环来遍历一个数组或切片。

    found := false
    for row := range table {
        for column := range table[row] {
            if table[row][column] == x {
                found = true
                break
            }
        }
        if found {
            break
        }
    }
 
    found := false
FOUND:
    for row := range table {
        for column := range table[row] {
            if table[row][column] == x {
                found = true
                break FOUND
            }
        }
    }
 

label是后面跟一个冒号的标识符。上面的两段代码功能一样,但是右侧的代码段是更加简短清晰,因为一旦找到要搜索的值(x),就会通过指定了label的break语句跳转到外层循环。如果我们嵌套了多重循环(例如,遍历三维的数据),则使用带有label的break语句可以具有更加明显的优势。

label可以用于for循环、switch语句和select语句。break和continue语句都可以带有label且都可以用于for循环内部。其中break语句也可以用于switch和select语句内部,且break也可以带有label标签。

label语句也可以单独出现,这样它们就可以是goto语句要跳转的(使用goto label语法) 的对象。如果goto语句跳过了任何创建变量的语句,则Go程序的执行结果是未知的,如果幸运的话,程序崩溃,但是也可能会继续运行并产生错误的结果。一种使用goto语句的场景是在自动生成代码时,因为在这种情况下goto语句是非常便捷的且无需关心意大利面式的代码。虽然在编撰本书时,Go语言中有超过30个源代码文件使用了goto语句,但是本书中完全没有使用goto语句的例子,我们提倡尽量避免使用它。

目录


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming From The Ground Up

Programming From The Ground Up

Jonathan Bartlett / Bartlett Publishing / 2004-07-31 / USD 34.95

Programming from the Ground Up is an introduction to programming using assembly language on the Linux platform for x86 machines. It is a great book for novices who are just learning to program as wel......一起来看看 《Programming From The Ground Up》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具