golang

理解go中的init函数

2018-07-09  本文已影响174人  wenmingxing

本文主要介绍go中init函数的使用及意义。

I、init的几个特征

1、init函数用于包的初始化,如初始化包中的变量,这个初始化在package xxx的时候完成,也就是在main之前完成;

2、每个包可以拥有多个init函数, 每个包的源文件也可以拥有多个init函数;

3、同一个包中多个init函数的执行顺序是没有明确定义的,但是不同包的init函数是根据包导入的依赖关系决定的。

4、init函数不能被其他函数调用,其实在main函数之前自动执行的。

II、例程

2.1 在main函数之前执行init
//test1
package main 

import "fmt"

func main() {
    fmt.Println("do in main")
}


func init() {
    fmt.Println("do in init1")
}

func init() {
    fmt.Println("do in init2")
}  

运行结果:

这个例子的运行结果说明:init函数在main函数之前执行,每个源文件中可以包含多个init函数。

2.2 init函数的执行顺序

现在我们init目录下的文件内容如下:

三个go程序代码分别如下所示:

// test.go
package main  

import (
    "fmt"
    _ "./level1"
)

func main() {
    fmt.Println("I am in main")
}  
// level1.go
package level1  

import (
    "fmt"
    _ "../level2"
)

func init() {
    fmt.Println("I am in level1")
}  
// level2.go  
package level2 

import "fmt"  

func init() {
    fmt.Println("I am in level2")
}  

运行test.go执行结果如下:

通过运行结果可以看出,go中不同包中init函数的执行顺序是根据包的导入关系决定的。

并且这种关系为:

III、关于import _ " "的说明

我们都知道,go对包导入非常严格,不允许导入不使用的包。但是有时候我们导入包只是为了做一些初始化的工作,这样就应该采用import _ " "的形式,如第II节的例程中我们采用了import _ " "的形式导入level1和level2包,这样就可以在只完成初始化,也不会报错。

【参考】

[1] 《The way to go》

上一篇下一篇

猜你喜欢

热点阅读