go语言学习笔记——函数的可变参数和defer理解

143 阅读1分钟
函数的可变参数
func Sum(ops ...int) {
	ret := 0;
	for _, op := range ops {
		ret += op
	}
	fmt.Println(ret)
}

定义可变长度的函数Sum,入参是可变的int类型的参数,在函数内部接受到对应的数值是一个数组,需要使用range循环获取到对应的数值

延迟执行defer

延迟执行函数,通常用于在代码执行结束,释放一些资源的操作,比如释放锁资源等

func ClearResource() {
	fmt.Println("Clear Resource");
}

func TestDefer(t *testing.T) {
	defer ClearResource();
	fmt.Println("execute something")
}

在执行TestDefer函数的时候,使用关键字defer定义了延迟执行函数ClearResource,所以会在输出“execute something”才会执行ClearResource函数

defer的一些使用场景:

1、代码逻辑执行之后,需要释放进程的锁资源

2、在读写文件的时候,需要关闭文件句柄,避免内存泄露

3、即使代码抛出异常,也会执行defer的具体逻辑,不会印象程序出错导致资源不能释放

func ClearResource() {
	fmt.Println("Clear Resource");
}

func TestDefer(t *testing.T) {
	defer ClearResource();
	fmt.Println("execute something")
	panic("error") // 抛出错误,此时,也会正常执行ClearResource函数的逻辑
}

defer的执行顺序:先进后出


func ClearResource1() {
	fmt.Println("Clear Resource1");
}

func ClearResource2() {
	fmt.Println("Clear Resource2");
}

func ClearResource3() {
	fmt.Println("Clear Resource3");
}

func TestDefer(t *testing.T) {
	defer ClearResource1();
	defer ClearResource2();
	defer ClearResource3();
	fmt.Println("execute something")
}

上面的代码块的输出顺序是:

execute something
Clear Resource3
Clear Resource2
Clear Resource1