定义
Golang中的特殊函数,会先于main函数执行且不能被调用。该函数无入参、返回值,同时支持选择性定义。也可以选择定义多个init函数,但建议只定义一个。
1 | package main |
sync.Once
init函数实现了sync.Once锁,只会被执行一次。
my/my.go
1
2
3
4
5
6
7
8
9
10
11package my
import "fmt"
func init() {
fmt.Println("a.init")
}
func Test() {
fmt.Println("a.Test")
}main.go
1
2
3
4
5
6
7
8
9
10
11
12
13package main
import (
"test/my"
)
func main() {
my.Test()
my.Test()
}
// a.init
// a.Test
// a.Test
初始化顺序
在package内部变量赋值 > init() > main()
。
1 | package main |
多个package调用时的初始化顺序,则取决于依赖顺序。
my.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package my
import (
"fmt"
"test/your"
)
func init() {
fmt.Println("a.init")
}
func Test() {
fmt.Println("a.Test")
your.Test()
}your.go
1
2
3
4
5
6
7
8
9
10
11package your
import "fmt"
func init() {
fmt.Println("your.init")
}
func Test() {
fmt.Println("your.Test")
}main.go
1
2
3
4
5
6
7
8
9
10
11
12
13package main
import (
"test/my"
)
func main() {
my.Test()
}
// your.init
// a.init
// a.Test
// your.Test
疑问
当package内定义多个init函数,它的执行顺序?