设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
社区
IT技术教程分享平台
免费课
实战课
vip专享
积分互换
工具箱
IDES激活
JetBrains全家桶系列激活
搜索
搜索
每日签到
本版
帖子
用户
IT技术教程资源分享平台-永久免费不加密
»
社区
›
编程开发教程
›
Golang教程
›
Go语言init函数详解,好好看看
返回列表
发新帖
Go语言init函数详解,好好看看
[复制链接]
2415
|
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 编码规范
PHP异步通信框架Swoole实战教程(22集)
Golang公链项目实战-2019年
Swoole入门与实战课程
学习Python就业有哪些方向?
Python基础知识汇总
MySQL实战45讲(HTML+MP3完整)-2018年
nginx负载均衡配置教程
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
数据库专栏
某课网专区
自学Python
前端web开发实战
IT课程
PHP实战教程
Go语言课程
Linux教程
fengzi
222
主题
232
帖子
3万
积分
管理员
积分
39074
发消息
回复楼主
返回列表
PHP开发
自学python
Golang教程
问题交流
帖子处理
图文推荐
ThinkPHP5与workerman实战—在线客服视频教程
2021-06-16
PHP与九大接口实战视频教程【80节】
2021-06-16
2020版-Swoole4.2从入门到精通全套高级实战
2020-05-13
ThinkPHP6+Swoole+Vue实战客服聊天项目系统
2021-01-12
PHP异步通信框架Swoole实战教程(22集)
2019-06-25
热门排行
1
2025年全网最新JetBrains系列IDE全家桶激活
2
ThinkPHP5与workerman实战—在线客服视频教
3
PHP与九大接口实战视频教程【80节】
4
2020版-Swoole4.2从入门到精通全套高级实战
5
ThinkPHP6+Swoole+Vue实战客服聊天项目系统
6
PHP异步通信框架Swoole实战教程(22集)
7
微信与支付宝支付一站式讲解与实战【完整版
8
Laravel5.8租房小程序项目实战开发完结版【
9
TP6&&API接口开发实战uniapp
10
MySQL实战45讲(HTML+MP3完整)-2018年