函数:可变参数及 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…