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") }
请发表评论