增加 有关 Package 中 init 方法的多处定义及运行顺序问题.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2021-07-28 15:58:34 +08:00
parent b389ac5e53
commit e2cf98a18d
1 changed files with 82 additions and 0 deletions

View File

@ -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 方法!