init 函数和 defer 函数
init 函数
init()函数是一个特殊的函数,存在以下特性:
不能被其他函数调用,而是在 main 函数执行之前,自动被调用 init 函数不能作为参数传入 不能有传入参数和返回值 一个 go 文件可以有多个 init 函数,谁在前面谁就先执行
go
package main
import "fmt"
func init() {
fmt.Println("init1")
}
func init() {
fmt.Println("init2")
}
func init() {
fmt.Println("init3")
}
func main() {
fmt.Println("main")
}
执行顺序
go
init1
init2
init3
main
defer 函数
关键字 defer 用于注册延迟调用 这些调用直到 return 前才被执。因此,可以用来做资源清理 多个 defer 语句,按先进后出的方式执行,谁离 return 近谁先执行 defer 语句中的变量,在 defer 声明时就决定了
go
package main
import "fmt"
func Func() {
defer fmt.Println("defer2")
fmt.Println("func")
defer fmt.Println("defer1")
}
func main() {
defer fmt.Println("defer4")
Func()
defer fmt.Println("defer3")
}
执行顺序
go
func
defer1
defer2
defer3
defer4