init函数
Go语言运行顺序:
当go执行程序时,首先递归访问import包,知道访问的包没有再导入其他包为止,之后运行至init函数返回至上一层模块继续运行至init函数返回,直到返回至运行程序,这个阶段称为初始化包。
init函数特性及作用
- 文件中init函数执行的时间要早于main函数。
如果在主程序开始之前做一些初始化工作,比如加载配置文件,加载数据库配置内容,基本的环境变量初始化,都可以在init函数中初始化。
- 如果在导入的包中需要初始化,就可以在导入的包中的init函数来进行初始化。
init函数实验
首先关闭go mod:go env -w GO111MODULE=off
新建一个文件夹作为实验项目文件夹,之后新建主进程模块test4_main.go,再创建lib1包和lib2包,每个包下分别创建lib1.go、lib2.go作为每个包的文件。
结构图如下:
test4_main.go:
package main
import (
"lib1"
"lib2"
)
func main() {
lib1.Lib1Test()
lib2.Lib2Test()
}
- 导入lib1包和lib2包,并且调用其中的方法
lib1.go:
package lib1 // 一般的包名和文件名是一致
import "fmt"
// lib1包提供的接口
func Lib1Test() {
fmt.Println("Lib1Test被执行")
}
func init(){
fmt.Println("lib1.init()方法被执行")
}
lib2.go:
package lib2
import "fmt"
// lib2包提供的接口
func Lib2Test() {
fmt.Println("Lib2Test被执行")
}
func init(){
fmt.Println("lib2.init()方法被执行")
}
运行test4_mian.go:
发现报错,原因是go编译器没有找到包的位置,go会在GOROOT和GOPATH下查找导入包的位置,这个时候需要在导入包时前面添加上路径(之后还会学习高阶的调用包的用法)。
修改test4_mian.go中的导包路径:
package main
import (
"GoStudy/5-init/lib1"
"GoStudy/5-init/lib2"
)
func main() {
lib1.Lib1Test()
lib2.Lib2Test()
}
注意在之前修改全局变量的GoPath之后,需要在GoPath下创建src目录,然后在src下放入项目文件,否则导入本地包Goland找不到路径。
函数名首字母的大小写区别
如果一个函数的首字母为大写
- 表示这个函数对外开放,可以被其他模块调用
如果一个函数的首字母为小写
- 表示这个函数只能被当前文件中的其他函数调用,不对外开放。
重新运行test4_main.go:
可以看到首先是init()方法被调用,之后才是test4_main的main函数中调用的两个包的方法。
通过这个实验说明了运行一个程序时首先在import包时,会执行导入包中的init方法,之后才会执行程序的main函数
此处评论已关闭