增加 有关 Package 中 init 方法的多处定义及运行顺序问题.
Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
parent
b389ac5e53
commit
e2cf98a18d
|
@ -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 方法!
|
Loading…
Reference in New Issue