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")
}

  

posted @ 2020-04-02 18:11  醉深梦始  阅读(139)  评论(0)    收藏  举报