【GO】init函数 - Go语言中文社区

【GO】init函数


参考资料

五分钟理解golang的init函数

1. golang程序初始化

golang程序初始化先于main函数执行,由runtime进行初始化,初始化顺序如下:

  • 初始化导入的包(包的初始化顺序并不是按导入顺序(“从上到下”)执行的,runtime需要解析包依赖关系,没有依赖的包最先初始化,与变量初始化依赖关系类似,参见golang变量的初始化);
  • 初始化包作用域的变量(该作用域的变量的初始化也并非按照“从上到下、从左到右”的顺序,runtime解析变量依赖关系,没有依赖的变量最先初始化,参见golang变量的初始化);
  • 执行包的init函数;

2. 特点

go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。

  • init函数是用于程序执行前做包的初始化的函数;
  • 每个包可以拥有多个init函数;
  • 包的每个源文件也可以拥有多个init函数;
  • 同一个包中多个init函数的执行顺序go语言没有明确的定义;
  • 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序;
  • init函数不能被其他函数调用,而是在main函数执行之前,自动被调用。main包中,可以有init函数
  • 程序编译时,先执行导入包的init函数,再执行本包内的init函数

3. 示例

main.go

package main                                                                                                                     

import (
   "fmt"              
)

var T int64 = a()

func init() {
   fmt.Println("init in main.go ")
}

func a() int64 {
   fmt.Println("calling a()")
   return 2
}

func main() {                  
   fmt.Println("calling main")     
}

输出:

calling a()
init in main.go
calling main

初始化顺序:变量初始化->init()->main()

版权声明:本文来源Segmentfault,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://segmentfault.com/a/1190000040053800
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 14:10:47
  • 阅读 ( 651 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢