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

mickelfeng · · 2155 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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() 类似处理当发生异常时要关闭文件的处理方式。

有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:mickelfeng

查看原文:go语言学习笔记(第2章)—流程

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2155 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传