Go语言开发-过程式编程-IF语句

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

内容简介:Go语言的if语句语法如下:在一个if语句块中可能含有零个或多个elseif子句,以及零个或一个else子句,而每个子句中又由多个语句组成。If中的大括号是必需的,但是分号只有在使用可选声明的情况下才需要。在Go语言的术语中,可选声明被称为简单语句。这意味着它可能是一个表达式、一个发送通道(使用<-操作符)、递增递减语句、赋值语句或短变量声明语句。如果变量是在一个可选声明中被创建的(即,使用了:=操作符),则其作用域为声明开始处直到if语句结束,所以在if语句或elseif子句,以及之后的每个分支直到if语

5.2.1. if语句

Go语言的if语句语法如下:

if optionalStatement1; booleanExpression1 {
    block1
} else if optionalStatement2; booleanExpression2 {
    block2
} else {
    block3
}
 

在一个if语句块中可能含有零个或多个elseif子句,以及零个或一个else子句,而每个子句中又由多个语句组成。

If中的大括号是必需的,但是分号只有在使用可选声明的情况下才需要。在 Go 语言的术语中,可选声明被称为简单语句。这意味着它可能是一个表达式、一个发送通道(使用<-操作符)、递增递减语句、赋值语句或短变量声明语句。如果变量是在一个可选声明中被创建的(即,使用了:=操作符),则其作用域为声明开始处直到if语句结束,所以在if语句或elseif子句,以及之后的每个分支直到if语句结束,该变量都可以直接被访问到。

布尔表达式必须是bool类型的。Go语言并不会自动转换非布尔值,所以我们必须要始终使用比较操作符,例如,if i==0 。(请参见表2.3)

之前的例子中我们己经大量使用了if语句,在本书的后续章节中我们还会使用。尽管如此,我们还是会介绍两个小例子,第一个用于展示可选简单语句的用途,第二个用于说明Go语言中if语句的习惯用法。

// Canonical ✓
if α := compute(); α < 0 {
    fmt.Printf("(%d)\n", -α)
} else {
    fmt.Println(α)
}
 
// Long-winded!
{
    α := compute()
    if α < 0 {
        fmt.Printf("(%d)\n", -α)
    } else {
        fmt.Println(α)
    }
}
 

上面的两段代码功能一样。右侧的代码片段必须使用额外的大括号来限制变量α的作用域,而左侧的代码片段会自动地将变量的作用域限制在if语句块中。

第二个关于if语句的例子是来自于archive_file_list 例子(在文件archive_file_list/archive_file_ list.go中)中的ArchiveFileList()函数。稍后,我们将使用该函数来比较if和switch语句。

func ArchiveFileList(file string) ([]string, error) {
    if suffix := Suffix(file); suffix == ".gz" {
        return GzipFileList(file)
    } else if suffix == ".tar" || suffix == ".tar.gz" || suffix == ".tgz" {
        return TarFileList(file)
    } else if suffix == ".zip" {
        return ZipFileList(file)
    }
    return nil, errors.New("unrecognized archive")
}
 
 

上面的函数读取命令行中给定的文件,对于那些可以处理的存档文件(.gz、.tar、.tar.gz、.zip),该函数会打印出这些存档文件的文件名,并以缩进格式打印出存档文件中所包含的文件列表。

请注意第一个if语句中的suffix变量的作用域为整个if … elseif …语句,就像上一个例子中的α变量一样,suffix在每个分支中都是可访问的。

其实我们是可以使用一个else语句来结尾的,但是这里使用的if结构在Go语言中是非常常

用的:一个if语句,零个或多个elseif语句,每个分支都使用一个return语句,最后使用了一个return语句而不是一个含有return语句的else分支。

func Suffix(file string) string {
    file = strings.ToLower(filepath.Base(file))
    if i := strings.LastIndex(file, "."); i > -1 {
        if file[i:] == ".bz2" || file[i:] == ".gz" || file[i:] == ".xz" {
            if j := strings.LastIndex(file[:i], "."); j > -1 && strings.HasPrefix(file[j:], ".tar") {
                return file[j:]
            }
        }
        return file[i:]
    }
    return file
}
 

这里的Suffix()函数是出于程序的完整性考虑:它接受一个文件名作为参数(其可能包含路径),并返回其小写的后缀名,后缀名也称为扩展名,即文件名中从点开始的最后那部分。如果文件名中没有点号,则原样返回(不包括路径);如果文件名以.tar.bz2、.tar.gz或tar.xz结尾,则它们就是要返回的后缀。

目录


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

《裂变:秒懂人工智能的基础课》

《裂变:秒懂人工智能的基础课》

王天一 / 电子工业出版社·博文视点 / 2018-6-13 / 59.00元

人工智能是指通过普通计算机程序实现的人类智能技术,这一学科不仅具有非凡的科学意义,对人类自身生存方式的影响也在不断加深。本书作为人工智能领域的入门读物,内容围绕人工智能的核心框架展开,具体包括数学基础知识、机器学习算法、人工神经网络原理、深度学习方法与实例、深度学习之外的人工智能和实践应用场景等模块。本书力图为人工智能初学者提供关于这一领域的全面认识,也为进一步的深入研究建立坚实的基础。一起来看看 《《裂变:秒懂人工智能的基础课》》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具