• 详解 Go 语言中的 init () 函数


    Go init 函数的详细说明

    初始化每个包后,会自动执行 init()函数,并且执行优先级高于主函数的执行优先级。
    init 函数通常用于:

    • 变量初始化
    • 检查 / 修复状态
    • 注册器
    • 运行计算

    包初始化

    为了使用导入的程序包,必须首先对其进行初始化。

    初始化始终在单个线程中执行,并且以程序包依赖关系的顺序执行。这由 Golang 的运行时系统控制,如下图所示:

    • 初始化导入的包(递归导入)
    • 计算并为块中声明的变量分配初始值
    • 在包中执行初始化函数

    在这里插入图片描述
    initial.go

    package main
    import "fmt"
    
    var _ int64=s()
    
    func init(){
      fmt.Println("init function --->")
    }
    func s() int64{
      fmt.Println("function s() --->")
      return 1
    }
    func main(){
      fmt.Println("main --->")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行结果

    function s() —>
    init function —>
    main —>
    
    • 1
    • 2
    • 3

    即使程序包被多次导入,初始化也只需要一次。

    特性

    init 函数不需要传入参数,也不需要返回任何值。与 main 相比,init 没有声明,因此无法引用。

    package main
    
    import "fmt"
    
    func init(){
      fmt.Println("init")
    }
    
    func main(){
      init()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    编译上述函数 “undefined:init” 时发生错误。

    每个源文件可以包含一个以上的 init 函数,请记住,写在每个源文件中的 “行进方式” 只能包含一个 init 函数,这有点不同,因此进行下一个验证。

    package main
    
    import "fmt"
    
    func init(){
      fmt.Println("init 1")
    }
    
    func init(){
      fmt.Println("init2")
    }
    
    func main(){
      fmt.Println("main")
    }
    
    /* 实施结果:
    init1
    init2
    main */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    从上面的示例中,您可以看到每个源文件可以包含多个 init 函数。

    初始化函数的一个常见示例是设置初始表达式的值。

    var precomputed=[20]float64{}
    
    func init(){
      var current float64=1
      precomputed[0]=current
      for i:=1;i<len(precomputed);i++{
        precomputed[i]=precomputed[i-1]*1.2
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    因为不可能在上面的代码 (这是一条语句) 中将 for 循环用作预先计算的值,所以可以使用 init 函数来解决此问题。

    Go 套件汇入规则的副作用

    Go 非常严格,不允许引用未使用的软件包。

    但是有时您引用包只是为了调用 init 函数进行一些初始化。
    空标识符 (即下划线) 的目的是解决此问题。

    import _ "image/png"
    
    • 1
  • 相关阅读:
    Java开发手册提炼
    java-net-php-python-jsp罪犯信息管理系统mp4计算机毕业设计程序
    NoSQL常用数据结构 LSM Tree 简介
    详细介绍NLP文本分类
    安装visual studio报错“无法安装msodbcsql“
    秋招突击——6/10——复习{(树形DP)树的最长路径、}——新作{电话号码的字母组合}
    低功耗学习记录
    永州植物细胞实验室建设布局方案
    Nginx架构详解
    【MATLAB】 04 数值微积分
  • 原文地址:https://blog.csdn.net/weiguang102/article/details/128177245