设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
社区
IT技术教程分享平台
免费课
实战课
vip专享
积分互换
工具箱
IDES激活
JetBrains全家桶系列激活
搜索
搜索
每日签到
本版
帖子
用户
IT技术教程资源分享平台-永久免费不加密
»
社区
›
编程开发教程
›
Golang教程
›
Go语言init函数详解,好好看看
返回列表
发新帖
Go语言init函数详解,好好看看
[复制链接]
1827
|
0
|
2019-6-11 12:28:12
|
显示全部楼层
|
阅读模式
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函数常用的一个例子就是用来设置初始表达式的值。
<a class="toolbar_item command_help help" href="https://www.jb51.net/article/158890.htm#">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
}
}</a>
复制代码
因为上面代码中不可能用for循环来作为precomputed的值(这是一句声明),因此可以用init函数来解决这个问题。
Go包导入规则的副作用
Go要求非常严格,不允许引用不使用的包。但是有时你引用包只是为了调用init函数去做一些初始化工作。此时空标识符(也就是下划线)的作用就是为了解决这个问题。
<a class="toolbar_item command_help help" href="https://www.jb51.net/article/158890.htm#">import _ "image/png"</a>
复制代码
主题推荐
Golang 面向对象编程
学习Python就业有哪些方向?
新浪短网址源码实现
【史上最全】淘金币、淘抢购、聚划算、天天特价活动
所有小白都能听懂的Python3.7入门课
PHP异步通信框架Swoole实战教程(22集)
NoSQL之Redis技术2016版视频
yii2 框架入门视频教程
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
fengzi
222
主题
232
帖子
3万
积分
管理员
积分
38810
发消息
回复楼主
返回列表
PHP开发
自学python
Golang教程
问题交流
帖子处理
图文推荐
ThinkPHP5与workerman实战—在线客服视频教程
2021-06-16
2020版-Swoole4.2从入门到精通全套高级实战
2020-05-13
PHP与九大接口实战视频教程【80节】
2021-06-16
ThinkPHP6+Swoole+Vue实战客服聊天项目系统
2021-01-12
PHP异步通信框架Swoole实战教程(22集)
2019-06-25
热门排行
1
2024年全网最新JetBrains系列IDE全家桶激活
2
ThinkPHP5与workerman实战—在线客服视频教
3
PHP与九大接口实战视频教程【80节】
4
2020版-Swoole4.2从入门到精通全套高级实战
5
PHP异步通信框架Swoole实战教程(22集)
6
Laravel5.8租房小程序项目实战开发完结版【
7
ThinkPHP6+Swoole+Vue实战客服聊天项目系统
8
微信与支付宝支付一站式讲解与实战【完整版
9
教你怎么打造PHP程序员简历【视频+面试题+
10
TP6&&API接口开发实战uniapp