Go语言init函数详解
作者:stpeace 发布时间:2024-05-11 09:18:31
标签:go,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"
来源:https://blog.csdn.net/stpeace/article/details/82901844


猜你喜欢
- 长期以来我就有对几年来交互设计的心得进行总结整理的想法。回到中国来亲身体会到不少同行,主要是交互设计师和视觉设计师对于交互设计的困惑,以及其
- 上一篇:微软建议的ASP性能优化28条守则(7)技巧 22:尽可能使用 Server.Transfer 代替 Response.Redire
- 本文实例讲述了Python基于递归算法求最小公倍数和最大公约数。分享给大家供大家参考,具体如下:# 最小公倍数def lcm(a, b, c
- 先看一下br怎么玩转“清除浮动”了。使用以下代码<br clear="all" />以下是代码效果演示:运行
- 本文实例讲述了Python pymongo模块用法。分享给大家供大家参考,具体如下:MongoDB优点 MongoDB是一个为当代web应用
- 如下所示:Uploadfiles = request.FILES.get('参数', '')for i in
- 环境python3,开发平台pycharm,使用urllib时,当url中存在中文时会出现以下错误:UnicodeEncodeError:
- 介绍init 方法通常用在初始化一个类实例时候,但其实它不是实例化一个类的时候第一个被调用 的方法。当使用 Student(id, name
- torch.cat()函数可以将多个张量拼接成一个张量。torch.cat()有两个参数,第一个是要拼接的张量的列表或是元组;第二个参数是拼
- strip()方法返回所有字符从开始及字符串的末尾(默认空格字符)被去除后的字符串的一个副本。语法以下是strip()方法的语法
- 我想没多少人敢保证写JavaScript能不用调试,那选择用什么方式调试会比较好呢?告别了我最爱的alert("MM")
- 许多网页开发者想从ASP.NET 页面传递一个值到另一个页面(比如从一个框架frame页面到一个弹窗页面)。看了代码就明白了。呵呵。(一)向
- 前言正则表达式是什么应该不用过多介绍,每位程序员应该都知道,正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是
- 上文中,我们一起学习了手把手教你实现一个 Python 计时器。本文中,云朵君将和大家一起了解什么是上下文管理器 和 Python
- 今天遇到一个要破解的栅栏密码,先给大家介绍通用的脚本。方法一(通用脚本):#!/usr/bin/env python # -*- codin
- # django manage.py扩展自定义命令环境: mac django1.10.3在实际的项目开发过程中,我们可能要执行某脚本初始化
- 一、一站式解决 1. 问题分析定位# 找到MySQL的配置文件,复制mysql的数据目录vim /etc/my.cnf# 进入ms
- 之前摸索tensorflow的时候安装踩坑的时间非常久,主要是没搞懂几个东西的关系,就在瞎调试,以及当时很多东西不懂,很多报错也一知半解的。
- 一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英
- mysql设置字段长度1.关于char和varcharchar是定长字符,varchar是变长字符。在mysql4.0版本之前,char和v