06-函数、defer、错误处理
06-函数、defer、错误处理
函数
go函数支持普通函数、匿名函数、闭包
-
函数本身可以当作变量
-
函数可以满足接口
-
函数可以返回多个值
1、函数的定义
通过func关键字定义
// 在第二个括号定义返回的参数,可以是多个参数(多个参数需要用括号括起来)
func add(a int, b int) (int, error) {
return a + b, nil
}
// 两个同类型参数,可以简写
func add(a, b int) int {}返回类型+变量定义的简写:
// 第二个括号是返回类型,sum是变量声明
func add(a int, b int) (int, error) {
var sum int
sum = a + b
return sum, nil
}
// 可以简写为:把变量的定义提到第二个括号中
func add(a int, b int) (sum int, err error) {
sum = a + b
return sum, err
}2、函数的参数
go函数的参数传递的时候是值传递(需要引用传递的话,请使用指针)
可以通过省略号,接收多个参数,得到的是一个slice切片
go中也有any类型
动态参数个数,必须要放到参数末尾
3、函数的赋值
这个赋值和js一样
4、匿名函数
Defer
Go defer 延迟执行、函数退出前必跑,类似 js的finally, try...finally
在连接数据库、打开文件、开始锁,无论如何,最后都需要去关闭数据库、关闭文件、解锁
执行顺序:
输出结果:3 4 2 1
defer输出是一个栈的顺序
deferReturn函数return是10(res为10),因为defer是在返回后执行,res又++,所以是11
错误处理
go中错误处理有三个概念:error、panic、recover。
1、error
在js中去捕获错误,是通过try...catch...,但是go是不能这样的,而是通过一个error,需要去判断error不等于nil处理。
定义函数需要有一个返回值去告诉调用者是否成功,go设计者要求我们必须去处理这个err,所以代码中会使用到大量的if err != nil
通过errors.New来构建一下error
简写:
2、panic
panic会导致程序退出,不推荐随便使用panic。类似nodejs中的throw new Error(),会直接抛出异常

3、recover
因为panic可能是代码写错了的,导致抛错停止服务了,所以go提供了recover这个函数,可以捕获到panic
只要是运行时崩溃的错误,就是panic(运行时崩溃:panic 是程序已经成功编译、跑起来之后,执行到某一行代码才触发的崩溃)
例如:我的空map

recover的使用:(必须在defer函数中调用)
4、使用注意
-
defer需要放在panic之前定义,不然抛出异常了都不会执行到后面了
-
recover只有在defer调用函数中才会生效
-
recover处理异常后,逻辑并不会恢复到panic抛出错误的代码处继续运行