Go函数小结(二)
1.函数的defer
作用:在函数中,程序员经常要创建资源(比如:数据库连接,文件句柄,锁等),为了在函数执行完成之后及时释放资源,go提供了defer机制,可以在函数执行完成后return前执行
//来一个defer中的经典面试题,求打印顺序
package main
import (
"fmt"
)
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
}

由此可见,当程序执行到defer的时候,现将其压入一个栈,然后再执行下一条,当函数执行完毕后,再从defer栈中从栈顶取出执行defer中的语句
注意:在defer入栈时,也会将相关值拷贝入栈,例如值拷贝参数
defer最重要的是可以及时释放资源
2.参数的传递方式
函数参数的传递方式有两种:值传递和引用传递
值传递是值得拷贝,引用是地址的拷贝
一般的,引用传递比值传递效率高,所以在函数声明中劲量使用引用传递
值类型:基本的数据类型 int、float、bool、数组和结构体
引用类型:指针、切片、map、channel、interface
3 panic的捕获
当程序中出现panic,会导致程序挂死,可以用recover捕获panic,防止程序异常退出,让程序异常可控
package main
import (
"fmt"
)
func main() {
defer_call()
fmt.Println("main exit safty...")
}
func defer_call() {
defer func(){
if err := recover();err != nil{
fmt.Println("get panic,err=",err)
}
}()
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
panic("I am panic")
}

4、自定义错误处理:
引用errors包中的New自定义一个错误信息
func newerr()(error){
return errors.New("i get new err")
}

浙公网安备 33010602011771号