在语法篇(一)中学习了go中基本的数据类型、变量、常量等组成语言的基本要素,在这一节中将会学习如何将这些元素组织起来,最终写成可以执行的代码。
在这一部分包括:
go中的流程控制语句;
go中函数的用法;
go特殊的错误处理方式;
Golang中的流程控制语句
在具体编程的时候免不了需要使用一些特殊的语句实现某些功能,比如使用循环语句来进行迭代,使用选择语句控制程序的执行方式等。这些语句在任何一门程序设计语言
中都会有支持,golang中除了支持常用的循环,条件选择语句以外,还支持跳转语句,下面分别看看这些语句的使用方式。
条件语句 if ,else if, else,...
用法:
if 表达式 { //注意花括号必须要和if 在同一行,包括下面的else 和 {也是;同时表达式不需要使用括号括起来 程序体 //且无论程序体有几行都需要有花括号,这是和 C 有区别的地方 . . . } else { 程序体 . . . }
注意,在if之后可以有表达式的赋值操作,之间使用分号隔开。
选择语句 switch
其实和if语句实现的功能类似,只是选择语句更加灵活并可以减少If else的分支开销,和C语言中的switch的使用类似,
switch 表达式 { //和if语句一样,表达式不需要使用括号,同时switch和 { 在同一行 case 条件一: 程序体 case 条件二: 程序体 case ... default: 程序体 }
这里和C语言的一个很大不同是,在每一个case条件的程序体中不需要使用break来强制结束。如果需要执行下面的case语句,那么可以通过添加 fallthrough 关键字来实现。
循环语句for
go中同样支持循环语句,但是与C等其他语言不同的是,go中只支持for来实现循环,不支持使用while。
//使用方式一:最基本的用法 for 变量初始化; 循环结束条件; 变量变化表达式 { 程序体 ... } //使用方式二: 无限循环的情况,类似于C中的for(;;) for { 程序体 ... }
同时在for的表达式中允许使用平衡的多重赋值,例如下面的在go中将一个数组逆序的写法:
a := [] int {1,2,3,4,5,6} for i, j := 0, len(a)-1; i<j; i, j = i + 1, j - 1 { a[i], a[j] = a[j], a[i] }
注意在go语言中也可以使用break语句。
跳转语句goto
作为初学者,我也不知道为什么Go语言会支持goto这种用法,在早年之前关于goto的弊端,已经被Dijkstra等人发文章集中讨论过,这里不做具体介绍,等以后深入学习之后再来补充,为什么设计者要这样来设计。
上面就是golang支持的四种程序控制语句,为了完成完整的代码,我们还需要函数来进行封装一些特定的功能,下面我们介绍golang中函数的使用方法。
Golang中函数的使用
函数的定义
与其它语言,例如C语言不同的是,Golang中函数的定义如下: func关键字 函数名 (参数1,参数2,...) (返回值1,返回值2,...) { 函数体 ... } // 例如下面的实现两个变量增加的函数: func Add(a int, b int) (ret int, err error) { return a+b, nil }
如果返回值只有一个那么括号可省,如果多个参数的类型相同,那么可省去前面变量的类型。
函数的调用
函数调用的方式是先导入导入包,然后通过包的方式使用函数。
这里需要注意的是,函数名的大小写在golang中是有讲究的,只有大写字母开头的函数才能被其它包使用。而使用小些字母
开头的函数只能在本包内可见。变量名的命名规则类似。
不定参数的支持
在golang中函数同样支持不定参数,即函数可以接受任意类型,任意个数的参数。
例如下面的函数myfunc可以接受任意多个int型的变量作为参数:
func myfunc (args ...int) { for _,arg := range args { fmt.Println(arg) } }
//在调用时:
myfunc(2,3,4)
mufunc(1,3,7,13)
//如果支持任意类型的参数,那么只需要将int 换成 interface{} 就可以了 func MyPrintf (args ...interface{}) { 程序体 ... }
多返回值
之前已经介绍过了golang的函数是支持多返回值的,如果哪一个返回值是不需要的那么直接可以将对应的值设为缺省就可以了。
匿名函数以及闭包