详解 Go 语言中的 init () 函数

news2024/11/17 16:43:32

阅读目录

  • Go init 函数的详细说明
    • 包初始化

Go init 函数的详细说明

初始化每个包后,会自动执行 init()函数,并且执行优先级高于主函数的执行优先级。
init 函数通常用于:

  • 变量初始化
  • 检查 / 修复状态
  • 注册器
  • 运行计算

包初始化

为了使用导入的程序包,必须首先对其进行初始化。

初始化始终在单个线程中执行,并且以程序包依赖关系的顺序执行。这由 Golang 的运行时系统控制,如下图所示:

  • 初始化导入的包(递归导入)
  • 计算并为块中声明的变量分配初始值
  • 在包中执行初始化函数

在这里插入图片描述
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 函数,请记住,写在每个源文件中的 “行进方式” 只能包含一个 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 函数。

初始化函数的一个常见示例是设置初始表达式的值。

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 循环用作预先计算的值,所以可以使用 init 函数来解决此问题。

Go 套件汇入规则的副作用

Go 非常严格,不允许引用未使用的软件包。

但是有时您引用包只是为了调用 init 函数进行一些初始化。
空标识符 (即下划线) 的目的是解决此问题。

import _ "image/png"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言零基础入门(完整版)

1软件下载 官网下载: https://sourceforge.net/projects/orwelldevcpp/ 百度网盘&#xff1a;https://pan.baidu.com/s/1mhHDjO8 提取密码&#xff1a;mken 推荐用百度网盘&#xff0c;官方下载太慢了 开始安装 首先双击打开刚刚下载的软件 点击0k 因为在安装过程中不能使用…

【计算机视觉】图像形成与颜色

图像形成与颜色 光照及阴影 辐射度学 颜色 颜色信息反映了入射光的能量分布与波长&#xff0c;可见光的波长在400nm到760nm之间。 RGB RGB分别代表三个基色&#xff08;R-红色、G-绿色、B-蓝色&#xff09;&#xff0c;如(0,0,0)表示黑色、(255, 255, 255)表示白色。其中2…

TS装饰器bindThis优雅实现React类组件中this绑定

初学React类组件时&#xff0c;最不爽的一点应该就是 this 指向问题了吧&#xff01;初识React的时候&#xff0c;肯定写过这样错误的demo。 import React from react; export class ReactTestClass extends React.Component {constructor(props) { super(props); this.state …

程序员如何进化成架构师?

作为程序员的上端&#xff0c;每一个架构师都承担着艰巨的任务&#xff1a;不仅仅要和产品进行周旋&#xff0c;还需要有十分坚实的技术作为基础打底。 那么&#xff0c;架构师都在考虑什么呢&#xff1f; 说到底还是程序架构、结构性的问题。 比如最近十分火爆的分布式系统…

STM32CubeIDE(stm32f767)添加DSP库

对于stm32f4 系列可以使用STM32Cube添加相应的库&#xff0c;自动生成代码。可以参考下面写的文章 (1条消息) STM32CubeMX关于添加DSP库的使用_W_oilpicture的博客-CSDN博客_cubemx dsp库 不过&#xff0c;对于stm32f767等M7的内核目前可能并不适用&#xff0c;需要自己手动添…

CS162 shell

本文记录我在做shell这个作业时用到有关资源&#xff0c;如Linux系统调用、Linux基础知识、C语言知识等。 这里只是非常简略地记录了一下&#xff0c;并且可能有理解不正确的地方&#xff0c;你可以把本文当作一个索引和没有思路时的启发&#xff0c;详细的信息可以再去查&…

SVM(支持向量机)基本形式推导

据说在dl之前是SVM撑起了ml的半片天&#xff0c;学习后发现SVM是由纯粹的数学推导、转化、求解、优化“堆砌”而来&#xff0c;不如说是数学撑起了ml&#xff0c;ml是数学的学科。以下根据老师ppt上讲解的思路讲讲个人对SVM基本形式推导的理解。 margin&#xff08;间隔&#x…

[附源码]计算机毕业设计现代诗歌交流平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2. IMU原理及姿态融合算法详解

文章目录2. IMU原理及姿态融合算法详解一、组合二、 原理a) 陀螺仪b) 加速度计c) 磁力计三、 旋转的表达a) 欧拉角b) 旋转矩阵c) 四元数d) 李群 SO(3)\text{SO}(3)SO(3) 及 李代数 so(3)\text{so}(3)so(3)四、 传感器的噪声及去除a) 陀螺仪b) 加速度计c) 磁力计五、姿态解算原理…

CSS基础-选择器进阶,背景相关属性(颜色/图片)

CSS基础-选择器进阶,背景相关属性(颜色/图片) 目标&#xff1a;能够理解 复合选择器 的规则&#xff0c;并使用 复合选择器 在 HTML 中选择元素 学习路径&#xff1a;1. 复合选择器2. 并集选择器3. 交集选择器4. hover伪类选择器5. Emmet语法 本次我们所学的内容&#xff1a; 1…

Kafka - 15 Kafka Offset | 自动和手动提交Offset | 指定Offset消费 | 漏消费和重复消费 | 消息积压

文章目录1. Offset 的默认维护位置2. 自动提交 Offset3. 手动提交 Offset1. 同步提交 offset2. 异步提交 offset4. 指定 Offset 消费5. 指定时间消费6. 漏消费和重复消费7. 消费者事务8. 数据积压&#xff08;消费者如何提高吞吐量&#xff09;1. Offset 的默认维护位置 Kafka…

触发器——SR锁存器

组合逻辑的基本单元电路是门电路 另外一种电路叫做时序逻辑电路&#xff0c;时序逻辑电路的输出不但和输入有关&#xff0c;还和原来的状态有关 在这样的电路中&#xff0c;一定要具有存储功能&#xff0c;存储原来的状态&#xff0c;一定也要有反馈回路&#xff0c;返回原来…

4-7:用Redis优化登陆模块

相关功能 使用Redis存储验证码 验证码需要频繁的访问与刷新&#xff0c;对性能要求较高。验证码不需永久保存&#xff0c;通常在很短的时间后就会失效。 (Redis可以设置有效时间&#xff0c;分布式应用也可以绕过session共享的问题)分布式部署时&#xff0c;存在Session共享的…

2022物联卡排行榜公司有哪些?

科技的发展日新月异&#xff0c;我们国家的发展战略也是支持高新科技公司的发展&#xff0c;所以越来越多的高新科技公司出现&#xff0c;但凡是高新科技公司&#xff0c;在设备的联网中&#xff0c;都会用到物联卡&#xff0c;所以物联卡的市场也愈发火爆&#xff0c;那么今天…

Zygote在Framework中起什么作用?

前言 提到Zygote可能了解一些的小伙伴会说&#xff0c;它是分裂进程用的。没错它最大的作用的确是分裂进程&#xff0c;但是它除了分裂进程外还做了什么呢。还是老规矩&#xff0c;让我们抱着几个问题来看文章。最后在结尾&#xff0c;再对问题进行思考回复。 你能大概描述一…

【springboot进阶】使用aop + 注解方式,简单实现spring cache redis 功能

目录 一、实现思路 二、定义缓存注解 三、aop 切面处理 四、使用方式 五、灵活的运用 六、总结 前几天有同学看了 SpringBoot整合RedisTemplate配置多个redis库 这篇文章&#xff0c;提问spring cache 能不能也动态配置多个redis库。介于笔者没怎么接触过&#xff0c;所以…

【Graph】NetworkX官方基础教程

NetworkX官方基础教程图的基础知识1.1 图&#xff08;graph&#xff09;及其分类1.2 节点的度&#xff08;degree&#xff09;1.3 子图&#xff08;subgraph&#xff09;1.4 连通图1.5 图的矩阵表示NetworkX概述NetworkX基础教程1. 创建图2. 节点3. 边4. 清空图5. 图可视化6. 访…

基于javaweb框架的springboot mybatis宠物商城源码含论文设计文档

在互联网高速发展、信息技术步入人类生活的情况下&#xff0c;电子贸易也得到了空前发展。网购几乎成为了人人都会进行的活动。近几年来&#xff0c;养宠物更是成为人们生活中重要的娱乐内容之一&#xff0c; 人们越来越多的讲感情也寄托给了宠物&#xff0c;以给自己另一个感情…

自动驾驶--预测技术

根据百度技术培训中心课程整理( https://bit.baidu.com/productsBuy?id72) 背景简介 无人车系统从算法模块可分为三个部分&#xff0c;首先是感知通过对传感器数据和环境信息进行计算来解决周围有什么的问题&#xff0c;其次是预测&#xff0c;根据感知信息预测环境下一步将…