init函数
# init函数
# init函数介绍
init()
函数是一个特殊的函数,存在以下特性:
不能被其他函数调用,而是在main函数执行之前,自动被调用
init函数不能作为参数传入
不能有传入参数和返回值
package main
import "fmt"
func init() {
fmt.Println("执行了init函数")
}
func main() {
fmt.Println("执行了main函数")
}
/*
执行了Init函数
执行了main函数
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 文件中执行顺序(全局变量 - init - main)
package main
import "fmt"
var num int = test()
func test() int {
fmt.Println("全局变量num")
return 10
}
func init() {
fmt.Println("执行了init1函数")
}
func main() {
fmt.Println("执行了main函数")
}
/*
全局变量num
执行了init1函数
执行了main函数
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 每个源文件能包含多个init函数
package main
import "fmt"
func init() {
fmt.Println("执行了init1函数")
}
func init() {
fmt.Println("执行了init2函数")
}
func init() {
fmt.Println("执行了init3函数")
}
func main() {
fmt.Println("执行了main函数")
}
/*
执行了init1函数
执行了init2函数
执行了init3函数
执行了main函数
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 导包顺序决定init函数执行顺序
go中不同包中init函数的执行顺序是根据包的导入关系决定的。类似于python的深度优先
//=====================main包
package main
import (
"fmt"
_ "mytest/level1"
)
func main() {
fmt.Println("main")
}
//=====================level1包
package level1
import (
"fmt"
_ "mytest/level2"
)
func init() {
fmt.Println("level1 init")
}
//=====================level2包
package level2
import "fmt"
func init() {
fmt.Println("level2 init")
}
level2 init
level1 init
main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
编辑 (opens new window)