Go语言init函数详解

 更新时间:2019-06-25 03:03:02   作者:佚名   我要评论(0)

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

对变量进行初始化
检查/修复程序的状

Go init函数详解

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

  • 对变量进行初始化
  • 检查/修复程序的状态
  • 注册
  • 运行一次计算

包的初始化

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

  • 初始化导入的包(递归导入)
  • 对包块中声明的变量进行计算和分配初始值
  • 执行包中的init函数

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函数,记得《the way to go》中写的是每个源文件只能包含一个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函数。

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循环来作为precomputed的值(这是一句声明),因此可以用init函数来解决这个问题。

Go包导入规则的副作用

Go要求非常严格,不允许引用不使用的包。但是有时你引用包只是为了调用init函数去做一些初始化工作。此时空标识符(也就是下划线)的作用就是为了解决这个问题。

import _ "image/png"

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:

  • strings命令分析浅谈Go和C++编译时的一点小区别
  • go panic时如何让函数返回数据?
  • go代码实现买房贷款月供计算的方法
  • linux下搭建go环境的安装配置讲解
  • 为什么Go语言把类型声明放在后面?
  • 用go gin server来做文件上传服务
  • 使用go gin来操作cookie的讲解
  • 在go中使用omitempty的代码实例
  • Golang命令行进行debug调试操作
  • go for range坑和闭包坑的分析

相关文章

  • Go语言init函数详解

    Go语言init函数详解

    Go init函数详解 init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来: 对变量进行初始化 检查/修复程序的状
    2019-06-25
  • golang time包的用法详解

    golang time包的用法详解

    在我们编程过程中,经常会用到与时间相关的各种务需求,下面来介绍 golang 中有关时间的一些基本用法,我们从 time 的几种 type 来开始介绍。 时间可分为时间点
    2019-06-25
  • 使用go xorm来操作mysql的方法实例

    使用go xorm来操作mysql的方法实例

    在golang中要实现对数据库的操作, 一个比较好用的方式就是使用XORM,xorm是一个简单而强大的Go语言ORM库,通过它可以使数据库操作非常简便。 在xorm里面,可
    2019-06-25
  • 在go中使用omitempty的代码实例

    在go中使用omitempty的代码实例

    omitempty在go中的使用 直接上代码: package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int
    2019-06-25
  • golang读取文件的常用方法总结

    golang读取文件的常用方法总结

    使用go语言读取文件的各种方式整理。 一次性加载到内存中 // * 整个文件读到内存,适用于文件较小的情况 //每次读取固定字节 //问题容易出现乱码,因为中文
    2019-06-25
  • 使用go gin来操作cookie的讲解

    使用go gin来操作cookie的讲解

    准确地说, 这个标题是有问题的, go gin只能给浏览器返回操作cookie的指令, 真正执行cookie操作的是浏览器。 但广泛地来讲, 说go gin操作cookie, 也是可以
    2019-06-25
  • 使用go来操作redis的方法示例

    使用go来操作redis的方法示例

    Redis简单介绍 简介 关于Redis的讨论,其实在现在的后台开发中已经是个老生常谈的问题,基本上也是后端开发面试的基本考察点。其中 Redis的背景介绍和细节说明
    2019-06-25
  • 用go gin server来做文件上传服务

    用go gin server来做文件上传服务

    之前已经go get安装了gin, 现在来玩下用go gin server作图片上传服务, 代码目录如下: taoge:~/test_gin$ tree . |-- public |-- template | `-- select_
    2019-06-25
  • linux shell常用循环与判断语句(for,while,until,if)使用方法

    linux shell常用循环与判断语句(for,while,until,if)使用方法

    shell的循环主要有3种,for,while,until shell的分支判断主要有2种,if,case 一,for循环 #!/bin/bash for file in $(ls /tmp/test/mytest |grep sh)
    2019-06-25
  • go语言的panic和recover函数用法实例

    go语言的panic和recover函数用法实例

    Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错误,与 error 不同,panic-recover 一般用在函数内部。一定要注意不要滥用
    2019-06-25

最新评论