当前位置: 首页 > news >正文

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

阅读目录

  • 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 --->")
}

执行结果

function s() —>
init function —>
main —>

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

特性

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

package main

import "fmt"

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

func main(){
  init()
}

编译上述函数 “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 */

从上面的示例中,您可以看到每个源文件可以包含多个 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
  }
}

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

Go 套件汇入规则的副作用

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

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

import _ "image/png"

相关文章:

  • 福建泉州网站建设/杭州seo网站
  • wordpress评分中文版/如何自己开发网站
  • 电子商务营销方法/南京seo优化公司
  • 坪地网站建设公司/推广普通话奋进新征程手抄报
  • 山东宏福建设集团有限公司网站/图片外链工具
  • wordpress添加侧栏广告/做外贸用什么软件找客户
  • 修复 爱普生 EPSON L4156 打印机 无法打印,开关 WIFI 墨水 三个灯同时闪烁的问题
  • 卡尔曼滤波之最优状态估计和最优状态估计算法
  • 【计算机网络】计算机网络复习总结 ----- 链路层
  • JUC并发编程与源码分析笔记06-Java内存模型之JMM
  • 【网关路由测试】——诊断路由测试
  • 软件架构基本功
  • 毫米波传感器原理介绍:测速_1相位
  • 多线程设计模式-全面详解(学习总结---从入门到深化)
  • Springboot面向高校应届毕业生的服务系统39t7k计算机毕业设计-课程设计-期末作业-毕设程序代做
  • java毕业设计“小蜜蜂”校园代取快递系统mybatis+源码+调试部署+系统+数据库+lw
  • OS-调度
  • SpringBoot @InitBinder注解绑定请求参数