go语言进阶 init() 函数

go 语言包

在一个项目中通常我们需要引入第三方包,我们来看下 当我们导入一个包的时候 发生了什么:

        首先我们先详细介绍下两个函数 init() main() 是 go 语言中的保留函数我们可以在源码中 定义 init()函数, 此函数会在包导入时执行, 例如 如果是在 main 中导入包,包中存在 init(), 那么 init() 中的代码会在 main() 函数执行前执行。 用于初始化包 所需要的特定材料。 例如:

包代码:

src/userPackage/tool.go

package userpackage
import "fmt"
func init(){
    fmt.Println("tool init")
}

主函数代码:

src/main.go

package main
import (
    "userPackage"
)

func main(){
    fmt.Pintln("main run")
    // 使用 userPackage
    userPackage.SomeFunc()
}

 他们在执行时: 会先输出: "tool init" 在输出 "main run"

 init() 函数和 main() 这两个函数的区别:

相同点:

  • 这两个函数都是 go 语言中的保留函数
  • 两个函数在定义是不能有 任何参数返回值
  • 该函数只能由 go 程序自动调用, 不能被引用(自己调用)

不同点:

  • init    可以应用于任意包中,且可以重复定义多个
  • main 函数只能用于 main 包中,切只能定义一个
  • init    主要用于初始化信息的
  • main 程序入口

init() 函数和 main() 函数执行顺序:

  • 在 main 包中的 go 文件默认总是会被执行。
  • 对用同一个 go 文件 init() 调用顺序是从上到下的
    package utils
    import "fmt"
    func init() {
    	fmt.Println("util init0")
    }
    func init() {
    	fmt.Println("util init1")
    }
    
    
    输出:
    util init0
    util init1
    
  • 同一个 package 中的不同文件 文件名安装字符串进行 "从大到小" 排序,之后顺序调用各个文件中的 init 函数
    package utils
    import "fmt"
    func init() {
    	fmt.Println("util init0")
    }
    func init() {
    	fmt.Println("util init1")
    }
    
    
    package utils
    import "fmt"
    func init() {
    	fmt.Println("utilTime init0")
    }
    
    
    
    输出:
    util init0
    util init1
    utilTime init0
    
  • 对于不同的 package, 如果不互相依赖 按照 main 包中  import 的顺序调用其他包中的 init() 函数。
    package main
    import (
    	"fmt"
    	_ "practice_package/utils"
    )
    func init() {
    	fmt.Println("main init")
    }
    func main() {
    	fmt.Println("main  main->run")
    }
    
    输出:
    util init0
    util init1
    utilTime init0
    main init
    main  main->run
    
  • 对于不同的 package,  如果相互依赖 调用顺序为 顺序为最后被依赖的 最先进行初始化。例如:  导入顺序: main ->A ->B ->C, 则 初始化顺序为 C->B->A->mian, 依次执行对应的  init 方法。main 包总是被最后一个初始化。应为它总是 依赖别的包
  • 避免出现循环导入 例如: A->B->C->A;(虽然实际生产不可避免,但还是得尽量避免) 
  • 一个包被多个包  import,  init() 函数只会执行一次

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城实战(031 业务-秒杀功能2)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第315p-第p318的内容 秒杀上架 定时上架功能 EnableAsync 异步 EnableScheduling 定时调度 Configuration 配置类 创建上架定时任务类和方法 …

抖店商家疑惑,自然流量突然下滑,为什么呢?

大家好,我是喷火龙。 很多的抖店商家会遇到一种情况,那就是自己店铺的流量好好的,不知道怎么的就突然没流量了,各方面的数据都断崖式的下降。 为什么会这样呢?原因有以下几点,大家可以检查一下&#xff0…

Typora配置自动上传图片到图床

Typora配置自动上传图片到图床 在多平台发布文章时,如果遇到图片不能导入的问题,推荐使用图床!推荐使用阿里云或腾讯云,免费的不用考虑了! PicGo下载 链接:夸克网盘分享 使用手册: PicGo is…

《python开发》cannot allocate memory in static TLS block-报错问题解决

阿丹: 今天在配置跑rasa训练的时候出现问题,找了国内论坛有解决的人,但是说的不明白。查阅了很多论坛之后发现了解决的方案。 https://github.com/keras-team/keras-tuner/issues/317 问题描述以及错误: 关键错误 :c…

升级最新版openssh-9.7p1及openssl-1.1.1h详细步骤及常见问题总结

近期因为openssh相继被漏洞扫描工具扫出存在漏洞,所以考虑升级操作系统中的openssh和openssl为最新版本,来避免漏洞风险。期间的升级过程及遇到的疑难问题,特此记录下来,供有需要的人参考。 本次目标是升级 openssh 为 9.7p1 版本…

ios v品会 api-sign算法

vip品会 api-sign算法还原 ios入门案例 视频系列 IOS逆向合集-前言哔哩哔哩bilibili 一、ios难度与安卓对比 这里直接复制 杨如画大佬的文章的内容: ios难度与安卓对比 很多人说ios逆向比安卓简单,有以下几个原因 1 首先就是闭源,安卓开源…

UIScrollView代理

场景: 想要监控某组件,可以通过addTarget,但是复杂一点的,如UIScrollView的滚动监听就需要通过代理来实现了。代理本质是官方定义好的协议(接口),你只要用官方给出的API接口,就能实…

osg库的下载和安装

下载 下载地址:https://github.com/openscenegraph/OpenSceneGraph 安装 打开Cmake.exe,将上述下载的osg文件下的CMakeLists.txt文件拖入Cmake界面中。 在其路径下新建一个build文件 并配置cmake,点击Configure 修改如下几个选项 ACTUAL_3RDPARTY_DIR BUILD_OSG_EXAM…

Open vSwitch 数据包转发

一、数据包转发流程 Open vSwitch 数据包转发流程如下图所示,其中红色数字序号表示数据包转发的步骤顺序。 以下步骤为一个数据包通过 OVS 时的首次处理流程:(步骤序号和图中序号一一对应) OVS 从设备接口中获取数据包并交…

GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践

当下是 Python 急剧发展的时代,越来越多的人开始学习和使用Pyhon,而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格,并解释了背后的原理和机制。 入门 Python 语言相对简单,但写出优雅的代码并…

营造科技展厅主题氛围,多媒体应用有哪些新策略?

长久以来,展厅作为线下向公众传递信息的窗口,其设计风格与内容主题紧密相连,展现出千姿百态的面貌。然而,随着数字多媒体技术的日新月异,展厅不再仅仅是传统的信息展示平台,而是成为了引领内容展示潮流的风…

技术积累1:Java容错机制

如何优雅地重试 原创 赵九文 字节跳动技术团队 2021-01-05 10:01 背景 在微服务架构中,一个大系统被拆分成多个小服务,小服务之间大量 RPC 调用,经常可能因为网络抖动等原因导致 RPC 调用失败,这时候使用重试机制可以提高请求的…

git获取的项目无法运行

一、Unsupported engine 问题:在使用命令npm install下载依赖项的时候就遇到了这个问题,有帖子说多试几次,其实这是提示node版本问题,版本的更新出现兼容性问题,多试几次也没用。 解决方案: 更新node.js的…

HiWoo Cloud数据采集监控系统

在数字化、智能化的浪潮中,企业如何高效地管理其设备、优化生产流程、提升运营效率?答案或许就隐藏在HiWoo Cloud——这款数据采集监控系统中。今天,就让我们一起走进HiWoo Cloud的世界,探索它如何助力企业实现数字化转型&#xf…

7 -力扣高频 SQL 50 题(基础版)

7- 产品销售分析 I select product_name,year,price from Sales left join Product on Sales.product_id Product.product_id;

matlab模拟太阳耀斑喷发

代码 function simulate_solar_flare% 参数设置gridSize 100; % 网格大小timeSteps 200; % 时间步数dt 0.1; % 时间步长% 初始化网格[X, Y] meshgrid(linspace(-5, 5, gridSize));Z zeros(size(X));% 设置耀斑初始位置和强度flareCenter [0, 0]; % 耀斑中心位置flareRad…

网络服务ftp实验

网络服务之ftp vsftpd的安装和配置 rpm -qc vsftpd #检查vsftpd安装包是否存在,存在即不需要安装 yum install -y vsftpd #yum 安装vsftpdcd /etc/vsftpd ls #切换到安装好vsftpd目录下查看文件cp vsftpd.conf vsftpd.conf.bak.20240604 #将vsftpd的…

9 个步骤内快速完成 SEO 审核

SEO审计对于提高网站在搜索引擎结果中的性能和可见性至关重要。这种系统评估涉及仔细检查各种元素,从关键字和页面优化到网站结构和页面速度等技术方面。在本指南中,我们将概述执行全面 SEO 检查器的 12 个基本步骤,帮助您确定优势、劣势和改…

一篇文章讲透排序算法之归并排序

0.前言 本篇文章将详细解释归并排序的原理,以及递归和非递归的代码原理。 一.概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使…

消费者api编写教程

1.基本属性配置 输入new Properties().var 回车 //创建属性Properties properties new Properties();//连接集群properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"node1:9092,node2:9092");//反序列化properties.put(ConsumerConfig.KEY_DESERIALIZER_CL…