Golang初始化顺序
一个例子
package main
import (
"fmt"
)
func init() {
a := "xxx"
fmt.Printf("hello, %s, %s", "world!", a)
}
func main() {
fmt.Println("main...")
}
编译之后执行:go tool objdump -s "main.init" main
。可以看到
TEXT main.init.0(SB) /Users/chenkang/learn/go/go_under_the_hook/03/main1.go
...
main1.go:9 0x108f25a e801caf7ff CALL runtime.convT2Estring(SB)
...
main1.go:9 0x108f2f2 e89981ffff CALL fmt.Printf(SB)
...
main1.go:7 0x108f30e e83dc3fbff CALL runtime.morestack_noctxt(SB)
main1.go:7 0x108f313 e998feffff JMP main.init.0(SB)
...
TEXT main.init(SB) <autogenerated>
...
<autogenerated>:1 0x108f3fe e89d56f9ff CALL runtime.throwinit(SB)
...
<autogenerated>:1 0x108f40c e84ffbffff CALL fmt.init(SB)
...
<autogenerated>:1 0x108f411 e89afdffff CALL main.init.0(SB)
...
<autogenerated>:1 0x108f426 e825c2fbff CALL runtime.morestack_noctxt(SB)
<autogenerated>:1 0x108f42b eb93 JMP main.init(SB)
...
执行顺序:
1. import中的包init
2. func init()
3. func main()