函数 function
-Go 函数不支持 嵌套,重载 和 默认函数
-但支持一下特性:
无需声明原型,不定长度变参,多返回值,命名返回值参数,匿名函数,闭包
-定义函数使用关键字 func
,且左大括号不能另起一行
-函数也可以作为一种类型使用
//基本结构
func A(a int, b int, c string) {
//...
}
//自定义返回值
func A(a int, b int, c string) (int, int) {
//...
}
//不定长变参,传进来的数据插入a这个slice
func A(a ...int) {
fmt.Println(a)
}
//不定长变参只能写在最后
func A(b string, a ...int) {
fmt.Println(a)
}
函数作为类型使用
func main() {
a := A
a()
}
func A() {
fmt.Println("Func A")
}
匿名函数
func main() {
a := func() {
fmt.Println("Func A")
}
a()
}
闭包
func main() {
f := closure(10)
// 11
fmt.Println(f(1))
}
func closure(x int) func(int) int {
return func(y int) int{
return x + y
}
}
延迟调用函数 defer
-在函数体执行结束后按照调用顺序的相反顺序逐个执行
-即使函数发生严重错误也会执行
-支持匿名函数的调用
-常用于资源清理,文件关闭,解锁以及记录时间等操作
-通过与匿名函数的配置可在 return
后修改函数计算结果
-如果函数体内某个变量作为 defer
时匿名函数的参数,则在定义 defer
时即已经获得了拷贝,否则则是引用某个变量的地址
-Go 没有异常机制,但有 panic
/ recover
模式来处理错误
-panic
可以在任何地方引发,但 recover
只有在 defer
调用的函数中有效
//打印结果为 2 1 0
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
//调用函数 打印结果为 3 3 3
for i := 0; i < 3; i++ {
defer func () {
fmt.Println(i)
}()
}
捕获异常
func main() {
A()
B()
C()
}
func A() {
fmt.Println("A")
}
func B() {
//捕获
defer func() {
if err := recover(); err != nil {
fmt.Println("Recover in B")
}
}()
panic("B")
}
func C() {
fmt.Println("C")
}
当前内容版权归 Programming-With-Love 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 Programming-With-Love .