[go学习笔记]十一、可变参数和defer

134 阅读1分钟

函数:可变参数及 defer

可变参数

func sum(ops ...int) int {
  s := 0
  for _, op := range ops {
    s += op
  }
  return s
}

示例代码

func Sum(ops ...int) int {
	s := 0
	for _, op := range ops {
		s += op
	}
	return s
}

func TestVarParam(t *testing.T) {
	t.Log(Sum(1, 2, 3, 4))
	t.Log(Sum(1, 2, 3, 4, 5))
}

输出

=== RUN   TestVarParam
--- PASS: TestVarParam (0.00s)
    func_test.go:45: 10
    func_test.go:46: 15
PASS

Process finished with exit code 0

defer函数

func TestDefer(t *testing.T) {
  defer func() {
    t.Log("Clear resources")
  }()
  t.Log("started")
  panic("Fatal error") //此时 defer仍会执行
}

示例代码

func Clear()  {
	fmt.Println("Clear resources")
}

func TestDefer(t *testing.T) {
	defer Clear()
	t.Log("started")
	panic("Fatal error")
	fmt.Println("End")
}

输出

=== RUN   TestDefer
Clear resources
--- FAIL: TestDefer (0.00s)
    func_test.go:55: started
panic: Fatal error [recovered]
	panic: Fatal error

goroutine 33 [running]:
testing.tRunner.func1(0xc0000d2100)
...

可以在输出中看到 Clear resources 在 --- FAIL: 前输出了,但是 End 却没有没输出,就是因为defer 会在函数执行结束,哪怕是异常中断,都会执行,类似Java或者Dotnet中的 try catch finally,可以安全的释放掉资源或者锁

示例代码请访问: github.com/wenjianzhan…