init函数

Go语言运行顺序:
image.png

  • 当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作为每个包的文件。

结构图如下:
image.png

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:
image.png
发现报错,原因是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:
image.png

可以看到首先是init()方法被调用,之后才是test4_main的main函数中调用的两个包的方法。

通过这个实验说明了运行一个程序时首先在import包时,会执行导入包中的init方法,之后才会执行程序的main函数

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏