Go:53---init初始化函数

纵饮孤独 提交于 2020-12-03 12:17:49

一、init函数介绍

  • 一个.go文件中可以定义一个init()函数,它用来做一些初始化操作,另外,该函数在包导入中也起到重要的作用
  • init函数有哪些特点:
    • init函数不能被主动调用,也不能在包外通过包名调用
    • init函数没有参数也没有返回值
    • 另外,init函数在导入包的时候会自动执行。例如B包的b.go中有一个init函数,A包中的a.go在导入B包的时候,B包中的init函数会自动执行
  • init函数一般用来:
    • 对变量进行初始化
    • 检查/修复程序的状态
    • 注册
    • 运行一次计算

二、在本地包执行

init函数执行时机

  • 一个包如果拥有init函数,那么在运行main()函数之前,全局声明之后会自动执行init()函数

演示案例

package main

import (
    "fmt"
)

var golbalValue int64

func init() {
    golbalValue = 100
    f()
}

func f() {
    fmt.Println("init...")
}

func main() {
    fmt.Println("golbalValue: ", golbalValue)
}

三、在导入包中执行

导入包的顺序

  • Go语言导入包的规则:会先从main包开始检查其导入的所有包,每个包中又可能导入了其他的包。Go编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码
  • init()在包导入中的执行时机是什么呢?
    • 一个包在导入另一个包时,会自动执行另一个包中的init()函数
    • 例如B包定义了一个init()函数,A包在调用B包时,B包中的init()函数会自动执行
  • 在运行时,被最后导入的包会最先初始化并调用其init()函数, 如下图示:

  • 一个应用场景:例如我们的程序导入了另一个包,但是不会使用到里面的任何变量和函数,我们仅仅是想执行另外一个包中的init()函数(例如,该init()函数会执行一个数据库的初始化等等),这个时候我们就可以"空导入"这个包,然后不使用其中的内容,但执行其包中的init()函数

演示案例

  • 第一步:假设现在我们在GOPATH/src/code.dobgshao.com/studgo/testpack/目录下有一个main.go文件,其内部定义了一个Init()函数

  • 第二步:现在我们在另一个包中导入上面的那个包,并且它也有自己的init()函数

  • 第三步:现在我们执行上面的main.go,可以看到其执行了另一个包中的init()函数,然后再执行自己的init()函数

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!