GO语言在流程中,添加了
fallthrough
关键字。
1. 条件语句
- 条件语句不需要使用括号将条件包含起来
- 无论语句体内有几条语句,花括号{}都是必须存在的
- 左花括号 { 必须与 if 或者 else 处于同一行
- 在 if 之后,条件语句之前,可以添加变量初始化语句,使用 ; 间隔
- 在有返回值的函数中,不允许将"最终的"return语句包含在if...else...结构中,否则会编译失败。失败原因在于,GO函数无法找到终止该函数的return语句
这里好像有点问题,自己测试时候按照例子是不会报编译错误的。
经过测试,GO语言也可以将函数的返回值作为条件语句
2. 选择语句
结果如下:
有几点需要注意:
- 左花括号 { 必须与 switch 处于同一行
- 条件表达式不限制为常量或者整数
- 单个 case 中,可以出现多个结果选项
- 与C的规则相反,GO语言不需要用 break 来明确退出一个case
- 只有在case中明确添加 fallthrough 关键字,才会继续执行紧跟的下一个 case
- 可以不设定 switch 之后的条件表达式,在此种情况下,整个switch结构与多个if...else...的逻辑作用相同
3. 循环语句
GO的循环语句只支持for循环,不支持while和do-while。
GO还进一步考虑到无限循环的场景,让开发者不用写无聊的for(;;){}
直接简化为如下写法:
有几点需要注意:
- 左花括号 { 必须与for处于同一行
- 允许在循环条件中定义和初始化变量,但GO不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量,不能使用i++, j++,需要使用i, j = i+1, j+1
- 也支持continue和break来控制循环,但提供了一个更高级的break,可以选择中断哪一个循环
4. 跳转语句
GO也支持goto关键字
函数
GO语言的函数基本组成为:关键字func, 函数名, 参数列表, 返回值, 函数体和返回语句
1. 函数定义
func Add(a, b int ) (ret int, err error) {
}
如果返回值列表中多个返回值的类型相同,也可以用同样的方式合并
如果函数只有一个返回值,也可以这么写:
func Add(a, b int) int {
}
2. 函数调用
函数调用非常方便,只要事先导入了该函数所在的包,就可以直接按照如下所示的方式调用函数
import "mymath"
c := mymath.Add(1, 2)
在GO语言中,函数支持多重返回值。利用函数的多重返回值和错误处理机制,可以很容易的写出优雅美观的GO代码。
GO语言中函数名字的大小写不仅仅是风格,更直接体现了该函数的可见性。对于很多注意美感的程序员,这里的函数名的首字母大写可能会让他们感觉不太适应,如果你改成小写的话,会遇到莫名其妙的编译错误。因为规则:
小写字母开头的函数只在本包内可见,大写字母开头的函数才能被其他包使用。这个规则也适用于类型和变量的可见性。
3. 不定参数
最早我碰到的不定参数,就是C的printf函数。合适的使用不定参数,可以让代码简单易用,尤其是输入输出函数,比如日志函数等等。
1) 不定参数类型
不定参数是指函数传入的参数个数为不定数量。要做到这一点,首先要将函数定义为接受不定参数类型:
func myfunc(args ...int){
for _, arg := range args{
fmt.println(arg)
}
}
上述代码表示函数myfunc()接受不定数量的参数,这些参数的类型都是int,以下都是可以使用的调用方式:
myfunc(2, 3, 4)
myfunc(1, 3, 7, 13)
形如 ...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。它是一个语法糖,即这种语法对语言的功能并没有影响,但是更方便程序员使用。使用语法糖能够增加程序的可读性,从而减少程序出错的机会。
2) 不定参数的传递
3) 任意类型的不定参数
如果你希望传递的参数是任意类型,可以指定类型为interface()
func Printf(format string, args ...interface{}) {
}
4. 多返回值
GO语言的函数或者成员的方法可以有多个返回值,这个特性能够使我们写出比其他语言更优雅,更简洁的代码。GO语言并不需要强制命名返回值。
如果调用方调用了一个具有多返回值的方法,但是却并不关心其中的某个返回值,可以简单的用一个下划线 "_"来跳过这个返回值。比如:
n, _ := f.Read(buf)
5. 匿名函数和闭包
匿名函数是指不需要定义函数名的一种函数实现方式。GO语言支持匿名函数。
在GO里面,函数可以像普通变量一样被传递或使用。
匿名函数由一个不带函数名的函数声明和函数体组成
匿名函数可以直接赋值给一个变量或者直接执行:
闭包略
6. 错误处理
错误处理是学习任何编程语言都需要考虑的一个重要话题。在早期语言中,错误处理不是语言规范的一部分,通常只作为一种编程范式的存在。GO语言在此功能上考虑的更为深远。漂亮的错误处理规范是GO语言最大的亮点之一。
1) error接口
GO语言引入了一个关于错误处理的标准模式,即error接口。
type error interface {
Error() string
}
对于大多数函数,如果要返回错误,大致上都可以定义为如下模式,将error作为多种返回值中的最后一个,但这并非是强制要求:
调用时的代码建议按如下方式处理错误情况:
defer() 类似处理当发生异常时要关闭文件的处理方式。
有疑问加站长微信联系(非本文作者)