【流程控制】go语言学习笔记(第2章)—流程

GO语言在流程中,添加了 fallthrough 关键字。

1. 条件语句
go语言学习笔记(第2章)—流程
  • 条件语句不须要使用括号将条件包含起来
  • 不管语句体内有几条语句,花括号{}都是必须存在的
  • 左花括号 { 必须与 if 或者 else 处于同一行
  • 在 if 以后,条件语句以前,能够添加变量初始化语句,使用 ; 间隔
  • 在有返回值的函数中,不容许将"最终的"return语句包含在if...else...结构中,不然会编译失败。失败缘由在于,GO函数没法找到终止该函数的return语句
这里好像有点问题,本身测试时候按照例子是不会报编译错误的。
通过测试,GO语言也能够将函数的返回值做为条件语句

2. 选择语句
go语言学习笔记(第2章)—流程

结果以下:
go语言学习笔记(第2章)—流程

有几点须要注意:
  • 左花括号 { 必须与 switch 处于同一行
  • 条件表达式不限制为常量或者整数
  • 单个 case 中,能够出现多个结果选项
  • 与C的规则相反,GO语言不须要用 break 来明确退出一个case
  • 只有在case中明确添加 fallthrough 关键字,才会继续执行紧跟的下一个 case
  • 能够不设定 switch 以后的条件表达式,在此种状况下,整个switch结构与多个if...else...的逻辑做用相同
go语言学习笔记(第2章)—流程

switch以后没有条件表达式。若是传入的参数都没有符合case中的条件,就什么都不作

3. 循环语句
GO的循环语句只支持for循环,不支持while和do-while。
go语言学习笔记(第2章)—流程

GO还进一步考虑到无限循环的场景,让开发者不用写无聊的for(;;){}
直接简化为以下写法:
go语言学习笔记(第2章)—流程

有几点须要注意:
  • 左花括号 { 必须与for处于同一行
  • 容许在循环条件中定义和初始化变量,但GO不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量,不能使用i++, j++,须要使用i, j = i+1, j+1
  • 也支持continue和break来控制循环,但提供了一个更高级的break,能够选择中断哪个循环
4. 跳转语句
GO也支持goto关键字

函数
GO语言的函数基本组成为:关键字func, 函数名, 参数列表, 返回值, 函数体和返回语句

1. 函数定义
go语言学习笔记(第2章)—流程
若是若干个相邻的参数类型的相同,能够在参数列表中省略前面变量的类型声明:
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) 不定参数的传递
go语言学习笔记(第2章)—流程

3) 任意类型的不定参数
若是你但愿传递的参数是任意类型,能够指定类型为interface()

func Printf(format string, args ...interface{}) {

}

4. 多返回值
GO语言的函数或者成员的方法能够有多个返回值,这个特性可以使咱们写出比其余语言更优雅,更简洁的代码。GO语言并不须要强制命名返回值。

若是调用方调用了一个具备多返回值的方法,可是却并不关心其中的某个返回值,能够简单的用一个下划线 "_"来跳过这个返回值。好比:

n, _ := f.Read(buf)

5. 匿名函数和闭包
匿名函数是指不须要定义函数名的一种函数实现方式。GO语言支持匿名函数。

在GO里面,函数能够像普通变量同样被传递或使用。
匿名函数由一个不带函数名的函数声明和函数体组成
go语言学习笔记(第2章)—流程

匿名函数能够直接赋值给一个变量或者直接执行:

闭包略

6. 错误处理
错误处理是学习任何编程语言都须要考虑的一个重要话题。在早期语言中,错误处理不是语言规范的一部分,一般只做为一种编程范式的存在。GO语言在此功能上考虑的更为深远。漂亮的错误处理规范是GO语言最大的亮点之一。

1) error接口
GO语言引入了一个关于错误处理的标准模式,即error接口。

type error interface {
Error() string
}

对于大多数函数,若是要返回错误,大体上均可以定义为以下模式,将error做为多种返回值中的最后一个,但这并不是是强制要求:

go语言学习笔记(第2章)—流程

调用时的代码建议按以下方式处理错误状况:

go语言学习笔记(第2章)—流程
defer() 相似处理当发生异常时要关闭文件的处理方式。
相关文章
相关标签/搜索