golang学习笔记11-模块化与包管理【重要】

news2024/9/24 12:20:00

注:本人已有C,C++,Python基础,只写本人认为的重点。
在第六节(golang学习笔记6)中,我讲了如何自定义包,包其实有两种引用方式,一种是不用模块,还有种是用模块,我用的就是后者。尚硅谷的视频(见本专栏简介)是不用模块的,但这其实是旧版本的做法,因为这个视频是18年的。在18年8月发布的1.11版本中,增加了模块管理的内容,到现在六年了,所以旧版本的方法肯定不是主流了,这里不做赘述,但是有必要强调下两者的主要区别:旧版本的自定义包必须放在gopath/src下,模块管理则没有这种限制,可以放在任意位置。但这不意味着gopath就没用了,它要用于存储下载的模块和依赖包,还有存放Go 工具,例如通过 go install 或 go get 安装的命令行工具。
综上,本节再深入讲下模块管理和讲一些包管理的细节。
一、模块管理

1.1 模块化与get命令

在你的项目根目录下打开命令行,执行如下命令:

go mod init your_module

其中your_module是自定义的模块名。执行该命令后,会出现一个模块管理文件go.mod,它的出现说明该项目已经模块化,即一个项目就是一个模块,该项目的管理都要通过这个mod文件来管理。注意,一个项目根目录只能有一个mod文件!
打开go.mod,你会看到如下内容:

module testmod

go 1.23.1

在第六节中,我讲了如何引用我在gitee上部署的模块(项目),如果成功下载,那么这里会出现require声明,说明当前模块已依赖一个外部包。go get命令具体的流程是这样的:
1.Go 先解析命令,然后尝试在指定的URL上查找对应的代码仓库,仓库不存在则报错。
2.一旦找到仓库,Go 会查找该仓库根目录下的 go.mod 文件,mod不存在则报错。
3.找到mod后,解析mod,读取模块的名称、Go 版本和依赖包。
4.下载整个模块的内容,包括项目下的所有包、文件和依赖包。
5.更新本地的go.mod,并建立本地项目和依赖包的关系,即声明依赖包。
6.生成go.sum,记录所下载模块的校验和。
到这里,相信大家对模块有了更深的认识。

1.2 规范的项目结构

规范项目有以下几个特点:
1.总项目下可以放多个子项目,子项目可以继续嵌套。
2.总项目根目录下肯定有一个mod文件,每个子项目可以有mod文件。
3.总项目必须包含main文件,main可以放在根目录,也可以放在子项目下。
4.main依赖的所有外部函数都放在main之外,由专门的包实现。
5.正式项目一般都有工具包(文件夹)。
综上,一个规范的项目结构至少是这样的:

your_project/           # 项目根目录
├── go.mod              # 项目模块
├── README.md           # 项目说明文件
├── main.go/            # 程序入口
└── utils/              # 工具包的根目录
    └── utils_code.go   # 工具包的实现文件

关于工具包,有几个点要注意:
1.工具包下的文件名未必要和工具包相同,但主程序入口文件名一般都用main。
2.工具包可以用别人的,也可以是自定义的,或者所有外部函数的实现都放在工具包下。
3.工具包实现时,函数名首字母必须大写,否则只能在当前文件内使用,无法作为外部引用
工具包实现后,main文件的补全示例如下:

package main

import "testmod/pkg1" //模块名/包路径

func main() {
	pkg1.Test()
}

以上就是规范项目结构的介绍,希望大家牢记。
二、包管理的细节
1.go没有像C++那样的重载机制,所以同一个包中不能有重复的函数名,具体来说,就是一个包下的某个文件中不能有重复的函数名,该包下的各文件之间的函数名也不能重复。有人可能说,把其中一个文件声明的package改了不行吗?当然不能!我在第二节(golang学习笔记2)中说过:同一目录下的所有go文件必须属于同一个包,即同一目录下的所有go文件必须都作一样的package声明,否则编译错误!
2.和上一点类似,一个包下的某个文件中不能有重复的全局变量名,该包下的各文件之间的全局变量名也不能重复。
3.不同包之间可以有重复的函数名和全局变量名,这可以解决不同的人想要实现的函数的名字一样,或全局变量一样的冲突,也是包的主要作用之一。
综上,如果一个项目还有子项目,子项目要建立main文件,而main文件又必须声明main,该怎么做?一定是新建目录将main文件和其他文件隔离!所以有子项目的项目结构如下:

your_project/           # 项目根目录
├── go.mod              # 项目模块
├── README.md           # 项目说明文件
├── subproject/         # 子项目根目录
│   └── main/           # main包根目录
│       └── main.go     # 子项目程序入口
└── utils/              # 工具包的根目录
    └── utils_code.go   # 工具包的实现文件

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

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

相关文章

最新视频号名字使用规范你了解了吗!

文章来源:视频号官方平台 视频号名字使用需遵循以下规范: 账号名字应当与简介的内容相符,且不得与已注册成功的账号名字重复。 账号超过180天未以视频号身份进行发表、评论等操作,将不再受到名字唯一保护,有其他用户申…

FPGA实现频率、幅度、相位可调的DDS以及DDS Compiler IP核的使用验证

文章目录 一、DDS介绍二、DDS原理2.1 频率计算2.2 相位改变2.3 波形切换 三、Matlab生成波形文件四、FPGA实现DDS4.1 Verilog代码4.2 仿真验证4.2.1 改变频率4.2.2 切换波形4.2.3 相位调节4.2.4 幅度调节 五、Xilinx DDS Compiler的使用5.1 功能框图5.1.1 相位累加器5.1.2 SIN/…

通俗讲解javascript的实例对象、原型对象和构造函数以及它们之间的关系

今天通俗讲解一下js的对象,因为要通俗,所以可能描述不甚准确。 在js中,想要创建一个对象,首先要写出构造函数(跟其它的语言不太一样哦,其它语言一般都会先写一个class 类名)。 构造函数写法如…

【PGCCC】 复合索引和部分索引,竟然能让查询速度提升 275 倍!

索引对于加速数据库查询和提高 PostgreSQL 应用程序的性能至关重要。但是,并非所有索引都以相同的方式发挥作用。复合索引和部分索引是两种常见类型,每种类型都有不同的用途和对性能的影响。本文我们将深入探讨复合索引和部分索引是什么、它们如何运作以…

关于在vue2中给el-input等输入框的placeholder加样式

::v-deep {.el-input--medium,.el-input__inner {height: 100%;background: #163670;border: 1px solid #4cc0f6;border-radius: 6px 6px 6px 6px;&::placeholder {color: #13EFFF;}} } 效果如下: .el-date-editor .el-range-input{&::placeholder {color:…

SAP MIGO M7146不支持移动原因

移动类型 Z91 查看配置:Z91 匹配的原因没有921 倒是Z92的原因里面有921 那解决方案有2种,但是要根据具体业务要求来 1、审视一下是否移动原因用错了 ?换一个移动原因 2、确实是这个移动类型 要用到这个移动原因 ,那就在上图 移…

Python编码系列—Python观察者模式:实现事件驱动架构的利器

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【数字ic自整资料】SV约束constraint

参考链接: SV--随机约束(一)_sv constraint-CSDN博客 SV--随机约束(二)_sv constraint f循环-CSDN博客 [SV]Constraint 遇到的问题_父类和子类 constraint-CSDN博客 目录 1、随机化的概念理解 2、约束(constrain…

基于报位时间判断船舶设备是否在线,基于心跳时间判断基站网络是否在线

文章目录 引言I 在线船舶查询在线或者离线船舶显示在线状态统计在线船舶II 树状显示船舶设备数据结构统计船舶设备在线数和总数III 基站网络是否在线IV 知识扩展统计某个key的数据,例如统计船舶分类下的在线船舶MyBatis引言 本文采用的数据库是SQL Server,开发语言为Java。 …

无线协议wlan在华为模拟器中的实现

无线技术 wifi6:标准为802.11; wifi发展趋势: vlan基本概念: wlan组网架构: 1)fat胖AP;能够独立工作,可以单独配置;小型网络使用,功能少; 2)fit瘦APAC:适用大型网络…

《深度学习》—— PyTorch的介绍及PyTorch的CPU版本安装

文章目录 一、PyTorch的简单介绍二、pytorch的CPU版本安装三、 torch、torchvision、torchaudio 三个库的介绍 一、PyTorch的简单介绍 PyTorch是一个由Facebook AI实验室开发的深度学习框架,它基于Python,并提供了高效的GPU加速和灵活的模型定义能力。1…

基于vue框架的传统服饰剪裁交流平台5m953(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,服装分类,服装资讯 开题报告内容 基于Vue框架的传统服饰剪裁交流平台开题报告 一、研究背景与意义 随着全球化进程的加速,文化多样性的保护与传承日益受到重视。传统服饰作为各民族历史文化的瑰宝,不仅承载…

阅读记录:Gradient Episodic Memory for Continual Learning

1. Contribution 提出了一组指标来评估模型在连续数据上的学习情况。这些指标不仅通过测试准确性来表征模型,还通过其跨任务迁移知识的能力来表征模型。针对持续学习任务,提出了GEM模型(Gradient Episodic Memory),它…

C++中stack类和queue类

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 数据结构习题_LaNzikinh篮子的博客-CSDN博客 初阶数据结构_LaNzikinh篮子的博客-CSDN博客 收入专栏:C_LaNzikinh篮子的博客-CSDN博客 其他专…

基于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度呢

关于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度的问题,我们以启明智显 ZX7981P智能无线接入型路由器(CPE)挂广合通5G模组为例说明: 一般来说,用 ZX7981P,通过软加速,U…

Java:列表操作

目录 1、判断列表是否为空或者为NULL2、列表包含3、列表排序4、列表截取5、列表合并6、列表求极值7、列表转字符串8、列表去重的四种方式9、列表转数组 1、判断列表是否为空或者为NULL Optional.ofNullable(list).orElse(Collections.emptyList()).isEmpty() // true为空或NU…

【JAVA-数据结构】时间空间复杂度计算案例

接着上一篇文章&#xff0c;对应举一些例子。 1.时间复杂度 【实例1】 // 计算func2的时间复杂度&#xff1f; void func2(int N) {int count 0;for (int k 0; k < 2 * N ; k) {count;} int M 10;while ((M--) > 0) {count;} System.out.println(count); } 基本操作…

在云渲染中3D工程文件安全性怎么样?

在云渲染中&#xff0c;3D工程文件的安全性是用户最关心的问题之一。随着企业对数据保护意识的增强&#xff0c;云渲染平台采取了严格的安全措施和加密技术&#xff0c;以确保用户数据的安全性和隐私性。 云渲染平台为了保障用户数据的安全&#xff0c;采取了多层次的安全措施。…

电子信息制造业数据安全如何防护?有什么加密方案?

电子信息制造业数据加密解决方案 问题 1.电子文档&#xff08;源代码、设计图纸、设计方案等&#xff09;均要做数据保护措施&#xff0c;防止内部人员有意或无意造成数据泄露&#xff1b; 2.与外部企业之间往来的外发文件&#xff0c;管控不当&#xff0c;容易造成泄密&…

工业能源物联网的建设与维护该如何实现

随着全球对可持续发展的重视&#xff0c;智能电网和微电网的应用逐渐成为能源转型的重要方向。在新型电力系统中&#xff0c;负荷侧资源不再是单纯消耗的“消费者”&#xff0c;而是既消耗电能又可生产电能的“产消者”。比如&#xff0c;电力用户利用屋顶建设光伏发电&#xf…