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

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

1.1 模块化与get命令

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

go mod init your_module

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

module testmod

go 1.23.1

在第六节中,我讲了如何引用我在gitee上部署的模块(项目),如果成功下载,那么module 下方会出现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,但一般的项目用一个mod足够。
3.项目必须包含main文件,main可以放根目录,也可以放子项目下。
4.main依赖的所有外部函数都要放在main外,由专门的包去实现
5.正式项目一般都有工具包(文件夹)
综上,一个规范的项目结构至少是这样的:

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

其中程序入口文件一般都命名为main,关于工具包,有几个点要注意:
1.包下的文件名未必要和包相同(go官方的某些包就是这样)。
2.工具包可以用别人的,也可以是自定义的,或者所有外部函数的实现都放在工具包下。
3.工具包实现时,函数名和全局变量名的首字母必须大写!否则只能在同包内使用,无法跨包使用。
工具包实现后,main文件的补全示例如下:

package main

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

func main() {
	utils.Test()
}

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

your_project/           # 项目根目录
├── go.mod              # 项目模块
├── README.md           # 项目说明文件
├── subproject/         # 子项目(也是一个包)根目录
│   ├── main/           # main包根目录
│   │   └── main.go     # 项目程序入口,声明main
│   ├── abc.go          # 其他文件,声明subproject
│   └── def.go          # 其他文件,声明subproject
└── utils/              # 工具包的根目录
    └── utils_code.go   # 工具包的实现文件

以上就是包管理的全部介绍了,希望大家重视。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值