函数的可变参数
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