diff --git a/Software/Development/Language/Go/Package/有关_Package_中_init_方法的多处定义及运行顺序问题.md b/Software/Development/Language/Go/Package/有关_Package_中_init_方法的多处定义及运行顺序问题.md new file mode 100644 index 0000000..dfda38b --- /dev/null +++ b/Software/Development/Language/Go/Package/有关_Package_中_init_方法的多处定义及运行顺序问题.md @@ -0,0 +1,82 @@ +# [有关 Package 中 init 方法的多处定义及运行顺序问题](https://blog.csdn.net/zhuxinquan61/article/details/73712251) + +在不了解这个问题之前,在网上搜索一下竟然搜出了两个完全相反的结果,所以打算自己测试下这个问题。 + +首先给出结论: + +* 在同一个 package 中,可以多个文件中定义 init 方法 +* 在同一个 go 文件中,可以重复定义 init 方法 +* 在同一个 package 中,不同文件中的 init 方法的执行按照文件名先后执行各个文件中的 init 方法 +* 在同一个文件中的多个 init 方法,按照在代码中编写的顺序依次执行不同的 init 方法 + +下面看下测试的代码: + +在当前目录下新建 main.go 及 testinit 目录,在 testinit 目录下共有三个文件:123.go、ini1.go、ini2.go,各个源码文件分别如下: + +**123.go:** + +```go +package testinit + +import "fmt" + +func init(){ + fmt.Println("123init") +} +``` + +**ini1.go:** + +```go +package testinit + +import "fmt" + +func init(){ + fmt.Println("init1-1") +} + +func init(){ + fmt.Println("init1-2") +} +``` + +**ini2.go:** + +```go +package testinit + +import "fmt" + +func init(){ + fmt.Println("init2") +} +``` + +**main.go:** + +```go +package main + +import ( + _ "./testinit" + "fmt" +) + +func main(){ + fmt.Println("main") +} +``` + +如上 main.go 中导入 testinit package, 然后 go build main.go, 执行显示如下: + +```bash +$ ./main.exe +123init +init1-1 +init1-2 +init2 +main +``` + +从运行的结构就能很清晰的看到,123、ini1、ini2 三个文件按照文件名执行,对于 ini1.go 中的两个 ini 方法按照 init 方法编写的先后顺序执行,最后才执行的 main 方法!