go语言进阶 init() 函数

news2024/12/28 6:02:49

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() 函数只会执行一次

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

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

相关文章

CANopen for Python

系列文章目录 前言 该软件包支持与 CANopen 节点网络交互。 注意 这里的大部分文档都是从 CANopen 维基百科页面上直接盗用的。 本文档正在编写中。欢迎反馈和修改! CANopen 是用于自动化领域嵌入式系统的通信协议和设备配置文件规范。根据 OSI 模型&#x…

【背包-BM70 兑换零钱(一)】

题目 BM70 兑换零钱(一) 描述 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。 如果无解,…

Promed Bioscience—高纯度胶原蛋白

Promed Bioscience——高纯度胶原蛋白供应商 专于研发,忠于质量,创新驱动 AXXORA 作为Enzo life sciences公司的子公司,是欧美最大的生命科学研究信息、服务、销售电子一站式服务平台之一,AXXORA精选欧洲四十多家优秀的生命科学研…

[Algorithm][动态规划][01背包问题][模板 背包][分割等和子集]详细讲解 +何为背包问题?

目录 0.何为背包问题?1.模板 背包1.题目链接2.算法原理详解3.代码实现 2.分割等和子集1.题目链接2.算法原理详解3.代码实现 0.何为背包问题? 背包问题:有限制条件下的"组合问题" 你有一个背包,地上有一堆物品&#xff…

基于zyyo主页与無名の主页合并二改,一款适合新手的个人主页

pengzi主页🙋 项目地址 简洁的布局:主页应该有清晰的布局,包括一个简洁的导航菜单和易于浏览的内容区域。避免使用过多的花哨效果,保持页面简洁明了。 个人资料介绍:在主页上展示一段简短的个人介绍,包括…

pikachu靶场(File Inclusion(文件包含)通关教程)

1.File Inclusion(local)本地文件包含 1.1打开网站,发现有个下拉框,随便选择一个,然后点击提交 1.2发现图中有个参数变了,其他的也会变,猜测这里可能有其他隐藏的文件 1.3直接进行抓包 ,右键发送到爆破模…

PXE、无人值守实验

PXE部署 [roottest2 ~]# systemctl stop firewalld [roottest2 ~]# setenforce 0一、部署tftp服务 [roottest2 ~]# yum -y install tftp-server.x86_64 xinetd.x86_64 [roottest2 ~]# systemctl start tftp [roottest2 ~]# systemctl enable tftp [roottest2 ~]# systemctl …

《深入浅出LLM 》(一):大模型概念综述

《深入浅出LLM 》(一):大模型概念综述 一、大模型概念 大规模语言模型(LargeLanguageModels,LLM),也称大规模语言模型或大型语言模型,是一种由包含数百亿以上参数的深度神经网络构建…

Python | Leetcode Python题解之第138题随机链表的复制

题目: 题解: class Solution:def copyRandomList(self, head: Optional[Node]) -> Optional[Node]:allNode[] # 用一个数组存储所有结点cur1headwhile cur1:allNode.append(cur1)cur1cur1.nextnlen(allNode)allRandom[-1]*n # 用一个数组存储所有节点…

Node.js后端构建指南:MongoDB与Express的集成

安装express 安装 Express 并将其保存到依赖列表中: $ cnpm install express --save 以上命令会将 Express 框架安装在当前目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录。以下几个重要的模块是需要与 express 框架一起安…

开源WebGIS全流程常用技术栈

1 数据生产 1.1 uDig uDig(http://udig.refractions.net/)是一个基于Java开源的桌面应用框架,它构建在Eclipse RCP和GeoTools(一个开源的Java GIS包)上。可以进行shp格式地图文件的编辑和查看;是一个开源空间数据查看…

前端最新面试题(基础模块HTML/CSS/JS篇)

目录 一、HTML、HTTP、WEB综合问题 1 前端需要注意哪些SEO 2 img的title和alt有什么区别 3 HTTP的几种请求方法用途 4 从浏览器地址栏输入url到显示页面的步骤 5 如何进行网站性能优化 6 HTTP状态码及其含义 7 语义化的理解 8 介绍一下你对浏览器内核的理解&#xff1…

阿里云服务器发送邮件失败 Could not connect to SMTP host: smtp.xxx.com, port: 465;

最近做了一个发送邮件的功能, 在本地调试完成后,部署到阿里云服务器就一直报错, Could not connect to SMTP host: smtp.qiye.aliyun.com, port: 465; 网上也搜索了很多的资料,最后花了好几个小时才解决, 报错日志如下…

全新抖音快手小红书视频解析去水印系统网站源码

这个系统支持几十种平台,包括抖音、快手小红书以及其他热门社交媒体平台。它可以帮助轻松地下载这些平台上的任何视频,并去除其中的水印,让你可以自由地保存和分享这些视频。 使用方法: 上传压缩包解压,网站信息在inc…

数据脱敏技术方案选择(word)

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

读取文件

自学python如何成为大佬(目录):自学python如何成为大佬(目录)_利用python语言智能手机的默认语言实战一-CSDN博客 在Python中打开文件后,除了可以向其写入或追加内容,还可以读取文件中的内容。读取文件内容主要分为以下几种情况: 1 读取指…

python爬虫入门教程(二):requests库的高级用法

requests库除了基本的GET和POST请求外,requests库还提供了许多高级功能,本文将介绍其中一些常用的用法。包括: 会话保持(Session)SSL证书验证文件上传代理设置自定义HTTP适配器超时设置 请求参数 文章最开始&#x…

github将默认分支main改为master

github将默认分支main改为master 1.进入github,点击setting 2.在setting中,选择Respositories,更新默认分支为master 3.选择要更新的项目,在项目中选择setting->general->切换默认分支

Elastic Search(ES)Java 入门实操(3)数据同步

基本概念和数据查询代码: Elastic Search (ES)Java 入门实操(1)下载安装、概念-CSDN博客 Elastic Search(ES)Java 入门实操(2)搜索代码-CSDN博客 想要使用 ES 来查询数…

MAVEN:自定义模板Archetype的创建

目录 一、简介 二、具体步骤 三、 vscode通过模板创建项目 四、通过IDEA创建 一、简介 有时候MAVEN自带的模板库并不能满足我们创建项目的需求,为了能够快速创建项目,免去每次复杂的配置,所以我们需要自定义模板库,本次操作基于…