Go基础语法之import原理
如果一个main导入其他包,包将被顺序导入 如果导入的包中依赖其他包(包B),会首先导入B包,然后初始化B包中的常量和变量,最后如果B包中有int,会自动执行init() 所有包导入完成后才会对main中常量和变量进行初始化,然后执行main中的init函数(如果存在),最后执行main函数 如果一个包被导入多次则该包只会被导入一次
一张图去理解上面所描述的规则
代码演示
目录结构
代码语言:javascript复制 test
├── a1
│ └── a.go
├── b1
│ └── b.go
└── main.go
a1.go文件
代码语言:javascript复制package a1
import "fmt"//引入package包
func init() {
fmt.Print("I'm a1.go")//打印
fmt.Print("n")
}
func A1() {//A1大写可以被外部调用
}
b1.go文件
代码语言:javascript复制 package b1
import (
"../A1"
"fmt"
)
func init() {
fmt.Print("I'm b1.go")
fmt.Print("n")
}
func B1() {//B1大写可以被外部调用
a1.A1()
}
main.go文件
代码语言:javascript复制 package main
import (
"./b1"
"./a1"
"fmt"
)
func main() {
a1.A1()
b1.B1()
fmt.Print("I'm main.go")
}
运行main.go文件输出:
代码语言:javascript复制 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函数,说明包被导入多次则该包只会被导入一次