go语言进阶 init() 函数

go 语言包

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

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

包代码:

src/userPackage/tool.gopackage userpackage
import "fmt"
func init(){fmt.Println("tool init")
}

主函数代码:

src/main.gopackage main
import ("userPackage"
)func main(){fmt.Pintln("main run")// 使用 userPackageuserPackage.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() 函数只会执行一次

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

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

相关文章

iPhone录音的m4a格式音频文件怎么转成MP3格式?

在日常工作生活中,我们有时会用电脑或手机录音,比如iPhone录音的M4A格式音频,要上传至某些软件或者平台使用,但是有时这些平台或者软件对音频格式有要求,比如有的就只能上传mp3格式的文件。 这个时候我们就需要先将音频…

基础IO(上)

前言 文件 内容 属性 所有对文件的操作就是对内容操作和对属性操作。内容是数据,属性也是数据。存储文件,必须既存储内容又存储数据。创建文件默认就是在磁盘中的。我们要访问一个文件的时候,都是要先把这个文件打开的。访问文件的本质就是…

无人机EasyDSS推拉流视频直播技术在农业植保中的精准应用与展望

随着科技的飞速发展,无人机在农业领域的应用越来越广泛,特别是在农业植保方面,无人机以其独特的优势,为农业生产带来了革命性的改变。 无人机在农业植保中的应用主要体现在两个方面:提高工作效率和精准喷洒药物。在以…

每天认识一家仪器仪表厂商 | 横河测试测量官网 - Yokogawa

横河Yokogawa工商信息: 横河测量技术(上海)有限公司于2000年08月09日成立。法定代表人山崎正晴(YAMAZAKI MASAHARU),公司经营范围包括:从事测量科技、机电科技领域内技术开发、技术转让、技术咨询、技术服务,仪器仪表、通讯设备、…

专业130+总分400+四川大学951信号与系统考研经验川大电子信息与通信工程,真题,大纲,参考书。教材。

今年四川大学951信号与系统专业课130(据我所知没有140以上的今年),总分400,顺利上岸川大,回顾一下自己这一年的复习,希望自己的经历可以对大家复习有所借鉴,也是对自己的考研画上句话。专业课&a…

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名…

mysql中InnoDB存储引擎的Buffer Pool

大家好。众所周知,对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是存储在磁盘上的。在处理客户端的请求时,当需要访问某个页…

思维导图——幕布

一、前言 幕布是一款专注于简化和组织信息的大纲笔记应用,它旨在帮助用户高效地整理知识点、优化工作流程以及规划个人生活。 二、软件特点 幕布工具的核心优势在于其能够快速将用户的输入转换成清晰的思维导图,便于视觉化地理解和记忆信息。 幕布还具…

插入mysql报错:Incorrect string value: ‘\xF0\xAC\x8C\x97\xE5\x9E...‘

原因分析 这个错误通常发生在使用MySQL数据库时,尝试将包含四字节UTF-8字符(通常表示为Unicode码点大于UFFFF的字符)插入到一个不支持这种字符的字符集列中。一般在插入睡眠emoji表情时容易遇到 解决 -- 设置数据库编码utf8mb4 ALTER DAT…

TrollInstallerX小白一键安装巨魔商店 分分钟安装成功

概述 TrollInstallerX 是一款通用的 TrollStore 安装程序。它注重可靠性和易用性。它的速度也非常快,能够在几秒钟内将 TrollStore 和/或其持久性助手安装到最新设备上。 TrollInstallerX 支持所有运行 iOS 14.0 - 16.6.1 的设备,包括 arm64 和 arm64e。…

若依分离版—增加通知公告预览及缩放功能

若依分离版—增加通知公告预览及缩放功能 前言开发通知公告 前言 若依分离版的通知公告没有预览功能&#xff0c;想开发通知公告功能 开发通知公告 效果如下 具体开发内容 修改若依notice代码如下。 <template><div class"app-container"><el-…

103.网络游戏逆向分析与漏洞攻防-ui界面的设计-加速功能的开关设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

李廉洋:6.4-6.5黄金原油再次走低,美盘行情分析及最新策略。

黄金消息面分析&#xff1a;全球债券周二上涨&#xff0c;呼应美债隔夜的涨势。美联储或早降息的押注增强了主权债务的吸引力。澳大利亚和新西兰10年期债券收益率下跌至少8个基点&#xff0c;先前数据显示&#xff0c;美国5月份工厂活动萎缩的速度加快。日本10年期债券收益率下…

Nginx location 与 Rewrite

Nginx正则表达式 location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发 location 大致可以分为三类&#xff1a; 精准匹配&#xff1a;location / {...} 一般匹配&#xff1a;location / {...} 正则匹配&#xff1a;location ~ / {...} location…

ctfshow解题,知识点学习

1.easy_zip&#xff08;misc&#xff09; 1&#xff09;打开环境后是一个压缩包&#xff0c;解压里面有个flag.txt文件需要密码&#xff0c; 2&#xff09;直接用工具爆破&#xff0c;即可找到密码 2.easy_eval 1&#xff09;进入题目环境&#xff0c;先进行代码审计 首先说是…

让你的博客实现负载均衡

零、缘起 有时候博客突然挂了&#xff0c;发现服务器厂商出了问题&#xff0c;很忧伤&#xff0c;我正在写着或查阅自家博客那种不可xx的内容。这时想着&#xff0c;如果这个博客有负载均衡就好了&#xff0c;空了想着实现下。 一分钟了解负载均衡的一切 选择第二种【反向代…

MoE 大模型的前世今生

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Vue3整合Tailwindcss之padding样式类

04 常用基础样式 padding 样式类 什么是内边距 基础样式 ClassPropertiesp-0padding: 0px;px-0padding-left: 0px; padding-right: 0px;py-0padding-top: 0px; padding-bottom: 0px;ps-0padding-inline-start: 0px;pe-0padding-inline-end: 0px;pt-0padding-top: 0px;pr-0pa…

kafka-生产者监听器(SpringBoot整合Kafka)

文章目录 1、生产者监听器1.1、创建生产者监听器1.2、发送消息测试1.3、使用Java代码创建主题分区副本1.4、application.yml配置----v1版1.5、屏蔽 kafka debug 日志 logback.xml1.6、引入spring-kafka依赖1.7、控制台日志 1、生产者监听器 1.1、创建生产者监听器 package co…

图片批量纵向拼接神器:轻松插入间隔像素,生成真彩绚丽长图,让你的创意无限延伸!

在数字艺术的世界里&#xff0c;图片拼接早已不再是简单的组合&#xff0c;而是创意与技术的融合。如果你正在寻找一款能够快速将图片进行纵向拼接&#xff0c;并且能轻松插入间隔像素&#xff0c;同时保证色彩绚丽的神器&#xff0c;那么&#xff0c;我们首助编辑高手的长图拼…