Go init函数(基于Go 1.14)

简介

init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来:

  • 对变量进行初始化
  • 加载项目中的配置变量
  • 检查/修复程序的状态
  • 注册
  • 运行一次计算

例子

func init() {
   fmt.Println("do init")
}
func main(){
   fmt.Println("main --->")
}

 

包的初始化

为了使用导入的包,首先必须将其初始化。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。这通过Golang的运行时系统控制

  1. 初始化导入的包,按照依赖顺序依次导入,并且做下面操作
    1. 对包块中声明的变量进行计算和分配初始值
    2. 执行包中的init函数
  2. 对包块中声明的变量进行计算和分配初始值
  3. 执行包中的init函数

demo

var _ int64=getInt64()

func init(){
   fmt.Println("do init 1 ")
}
func init(){
   fmt.Println("do init 2")
}
func getInt64() int64{
   fmt.Println("do getInt64 ")
   return 1
}

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

 

输出:

do getInt64 
do init 1 
do init 2
do main

 

 

特点

  • 每个包可以拥有多个init函数,每个源文件中可以包含多个init函数
  • init函数不需要传入参数,也不会返回任何值。
  • 同一个包中多个init函数的执行顺序go语言没有明确的定义 (很多博客上都说没有明确定义,但是经过个人多次测试感觉应该是顺序执行)

Demo

init.go

package main

import "fmt"


func init(){
	fmt.Println("do init 1 ")
}
func init(){
	fmt.Println("do init 2")
}
func getInt64() int64{
	fmt.Println("do getInt64 ")
	return 1
}

 

main.go

package main

import "fmt"

func init() {
	fmt.Println("do init")
}
func main(){
	fmt.Println("main --->")
}

输出

do init 1 
do init 2
do init
main
  • 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
  • init函数不能被其他函数调用,而是在main函数执行之前,自动被调用

 

补充知识

     Go要求非常严格,不允许引用不使用的包,不过我们可以采用下面的格式(import _ pkg)来引用,只是用它来执行对应包的init函数。

import _ "image/png"

 

参考资料

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值