简介
延迟调用(defer)的优势是:
- 即使函数执行出错,依然能保证回收资源等操作得以执行
- 可以在变量的定义处加入defer,代码结构上避免忘记做某些数据的回收
劣势:
- 性能上会会比直接调用慢一些
- 如果在defer中释放,相对来说只会在函数执行结束的时候才会调用,变量生命周期会变长.
定义
编写以下程序, dump出汇编.
defer
主要调用了一下两个函数func deferprocStack(d *_defer)
和func deferreturn(arg0 uintptr)
package main
import (
"fmt"
)
func main() {
defer fmt.Println(0x11)
}
(base) ➜ readsrc go tool objdump -s "main\.main" ./test
TEXT main.main(SB) /home/darcyaf/Development/go/src/readsrc/main.go
main.go:7 0x48cf30 64488b0c25f8ffffff MOVQ FS:0xfffffff8, CX
main.go:7 0x48cf39 488d4424d8 LEAQ -0x28(SP), AX
main.go:7 0x48cf3e 483b4110 CMPQ 0x10(CX), AX
main.go:7 0x48cf42 0f86b1000000 JBE 0x48cff9
main.go:7 0x48cf48 4881eca8000000 SUBQ $0xa8, SP
main.go:7 0x48cf4f 4889ac24a0000000 MOVQ BP, 0xa0(SP)
main.go:7 0x48cf57 488dac24a0000000 LEAQ 0xa0(SP), BP
main.go:8 0x48cf5f 0f57c0 XORPS X0, X0
main.go:8 0x48cf62 0f11842490000000 MOVUPS X0, 0x90(SP)
main.go:8 0x48cf6a 488d050f190100 LEAQ 0x1190f(IP), AX
main.go:8 0x48cf71 4889842490000000 MOVQ AX, 0x90(SP)
main.go:8 0x48cf79 488d05a0cd0400 LEAQ 0x4cda0(IP), AX
main.go:8 0x48cf80 4889842498000000 MOVQ AX, 0x98(SP)
main.go:8 0x48cf88 c744243030000000 MOVL $0x30, 0x30(SP)
main.go:8 0x48cf90 488d0561c8030