Go基础语法之import原理
如果一个main导入其他包,包将被顺序导入
如果导入的包中依赖其他包(包B),会首先导入B包,然后初始化B包中的常量和变量,最后如果B包中有int,会自动执行init()
所有包导入完成后才会对main中常量和变量进行初始化,然后执行main中的init函数(如果存在),最后执行main函数
如果一个包被导入多次则该包只会被导入一次
- 一张图去理解上面所描述的规则
代码演示
目录结构
test ├── a1 │ └── a.go ├── b1 │ └── b.go └── main.go
a1.go文件
package a1 import "fmt"//引入package包 func init() { fmt.Print("I'm a1.go")//打印 fmt.Print("\n") } func A1() {//A1大写可以被外部调用 }
b1.go文件
package b1 import ( "../A1" "fmt" ) func init() { fmt.Print("I'm b1.go") fmt.Print("\n") } func B1() {//B1大写可以被外部调用 a1.A1() }
main.go文件
package main import ( "./b1" "./a1" "fmt" ) func main() { a1.A1() b1.B1() fmt.Print("I'm main.go") }
运行main.go文件输出:
I'm b1.go I'm a1.go I'm main.go Process finished with exit code 0
由此可以看出如果一个main导入其他包,包将被顺序导入,执行init函数,最后执行main函数,另外我们在b1的B1包函数导入了a1包却没执行两次a1包的init函数,说明包被导入多次则该包只会被导入一次
Last modification:September 18, 2020
© Allow specification reprint
Comment here is closed