From e2cf98a18dac9fbcb08f3c6815bf28c0e16e8037 Mon Sep 17 00:00:00 2001 From: "chen.yang" Date: Wed, 28 Jul 2021 15:58:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E6=9C=89=E5=85=B3=20Packa?= =?UTF-8?q?ge=20=E4=B8=AD=20init=20=E6=96=B9=E6=B3=95=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E5=A4=84=E5=AE=9A=E4=B9=89=E5=8F=8A=E8=BF=90=E8=A1=8C=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E9=97=AE=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chen.yang --- ...kage_中_init_方法的多处定义及运行顺序问题.md | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Software/Development/Language/Go/Package/有关_Package_中_init_方法的多处定义及运行顺序问题.md 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 方法!