自学内容网 自学内容网

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

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

1.1 模块化与get命令

假设当前项目根目录是…/testproject,模块就要建立在这个目录下,所以我们在这个目录下打开命令行,执行如下命令:

go mod init your_module

其中your_module是自定义的模块名,我这里是testmod,那么我的目录结构就是这样的:
在这里插入图片描述
go.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.在testproject下创建自定义包pkg1,即创建目录(文件夹)pkg1,一个文件夹就是一个包。
2.在当前目录下再建立go文件,名字可以改为和上级目录一样,即pkg1,当然你也可以写别的名字,因为官方源码中,有些包下就没有和包名相同的go文件。
3.在pkg1.go中声明包pkg1。
4.回到根目录,建立main包,步骤和前三步一样。当然,这里的go文件名就非常建议写main了,因为main函数是项目必须的,且main.go最容易识别。
现在,我们就建立了一个完整规范的项目结构,大家可以检查是否和我的一样:
在这里插入图片描述
其中main包的作用不必多说,它是程序入口,是必须的。pkg1虽然不是必须的,但一般的项目都会有,因为要用到很多函数,这些函数都写在main中是不现实的,这就需要把所有自定义的函数打包放在main包外,等用到时引用下即可,这是项目风格,不必纠结。
然后我们先完善pkg1,由于还没学到函数,直接按main函数的格式自定义一个即可,示例如下:

package pkg1

func Test() {

}

特别注意:函数名首字母必须大写,否则只能在当前文件内使用,无法作为外部引用。
最后,我们再完善main.go,即写main函数和引用包。main文件的补全示例如下:

package main

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

func main() {
pkg1.Test()
}

OK,正所谓“麻雀虽小五脏俱全”,一个规范的项目就搭建好了!
二、包管理的细节
1.go没有像C++那样的重载机制,所以同一个包中不能有重复的函数名,具体来说,就是一个包下的某个文件中不能有重复的函数名,该包下的各文件之间的函数名也不能重复。有人可能说,把其中一个文件声明的package改了不行吗?当然不能!我在第二节(golang学习笔记2)中说过:同一目录下的所有go文件必须属于同一个包,即同一目录下的所有go文件必须都作一样的package声明,否则编译错误!
2.和上一点类似,一个包下的某个文件中不能有重复的全局变量名,该包下的各文件之间的全局变量名也不能重复。
3.不同包之间可以有重复的函数名和全局变量名,这可以解决不同的人想要实现的函数的名字一样,或全局变量一样的冲突,也是包的主要作用之一。


原文地址:https://blog.csdn.net/weixin_54259326/article/details/142462498

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!