首页 > 其他分享 >golang学习笔记11-模块化与包管理【重要】

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

时间:2024-09-25 08:55:06浏览次数:3  
标签:11 文件 模块化 golang 模块 go 根目录 main mod

注:本人已有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   # 工具包的实现文件

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

标签:11,文件,模块化,golang,模块,go,根目录,main,mod
From: https://blog.csdn.net/weixin_54259326/article/details/142462498

相关文章

  • 【高中数学/对数/比大小】a=log_5_7 vs b=log_11_14
    【问题】比较a=log_5_7,b=log_11_14两数的大小?【解答】a-b=ln7/ln5-ln14/ln11=(ln7*ln11-ln5*ln14)/ln5/ln11=(ln7*ln11-ln5*ln7-ln5*ln2)/ln5/ln11=(ln7*ln2.2-ln5*ln2)/ln5/ln11>0所以a>b即log_5_7>log_11_14END......
  • Windows 11 显示字体不清晰解决办法
    在一台AIO520-22的显示器上,100%,125%都感觉字体与图标不清晰。第一步,先将显示器设置硬件推荐分辨率,显示器硬件说明书或外包装上有,或使用系统中设置分辨率的中推荐那一项。第二步,查看PPI是多少,这一步关键得知道硬件尺寸。屏幕像素密度(PPI)查询第三步,计算出你的显示器适合的放大比......
  • 【算法题】11. 盛最多水的容器-力扣(LeetCode)
    【算法题】11.盛最多水的容器-力扣(LeetCode)1.题目下方是力扣官方题目的地址11.盛最多水的容器给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的......
  • Android 11.0 蓝牙音乐获取歌手、歌曲等信息功能实现
    1.前言在11.0的系统rom定制化开发中,在一些功能性开发中,可能会遇到一些蓝牙音乐的项目,所以会要求在手机端获取蓝牙音乐的歌手歌曲的信息功能,这就需要了解Bluetooth的音乐播放功能,然后实现这些获取歌手信息和歌曲详情的功能2.蓝牙音乐获取歌手、歌曲等信息功能实现的核心类pa......
  • C++11新特性:正则表达式
    摘要本文介绍了正则表达式的基础概念,包括元字符、字符类、量词和锚点,展示了其在验证字符串、文本搜索、替换和数据提取中的应用。同时,详细讲解了C++11中正则表达式的使用示例,包括std::regex。正则表达式正则表达式(RegularExpressions)是一种强大的文本处理工具,它使用单个字符......
  • 新一代工业物联网连接:DRP10188300001,DRP10188300002,DRP10188300011,DRP10188300012
    工业以太网连接器能够实现以太网和其他工业协议的物联网连接,覆盖了从企业/云到工厂车间中传感器/执行器的所有操作层面。工业RJ系列模块化以太网插头提供符合ANSI/TIA-568.2-D的CAT6A性能。它在长达100m的应用中支持千兆位以太网协议和10G链路。可现场端接的设计便于组......
  • 勇者斗恶龙:英雄丢失VCOMP110.DLL出错怎么解决?《勇者斗恶龙:英雄》VCOMP110.DLL缺失的完
    当《勇者斗恶龙:英雄》提示丢失VCOMP110.DLL出错时,这通常意味着系统中缺少了这个关键的动态链接库文件,该文件对于游戏的正常运行至关重要。以下是一些解决这一问题的完美修复方法:一、确认问题首先,确认是否真的出现了VCOMP110.DLL文件缺失的错误。这通常会在游戏启动时出现相......
  • 尘埃拉力赛D3D11.dll文件丢失:轻松解决尘埃拉力赛D3D11.dll丢失方案汇总
    当您在尝试启动《尘埃拉力赛》(DiRTRally)时遇到“找不到D3D11.dll”或“D3D11.dll文件丢失”的错误提示,这意味着您的计算机上缺少或损坏了Direct3D11API的一个重要组件。D3D11.dll文件是Windows系统中用于高性能图形渲染的关键文件之一,对于《尘埃拉力赛》这类需要高级图形处......
  • 11、Linux软件安装及使用
    Windows软件安装流程安装检查:检查系统是否满足软件的安装要求,包括操作系统版本、硬盘空间、内存要求等。释放文件:解压安装包中的文件到临时目录。复制可执行文件:将主要的可执行文件复制到指定的安装路径。安装DLL动态链接库/安装服务:根据需要安装动态链接库文件(DLL)和......
  • 题解:P6351 [PA2011] Hard Choice
    题意维护一张无向图,要求支持以下操作:切断一条边。查询两个点是否有有两条完全不同的路径相连。分析因为断边操作不好维护,考虑离线后将断边变为加边。因此,我们只需要维护加边操作即可。考虑使用LCT。首先,因为涉及到边权,套路地用节点代替边。如果某一条边连接的两个点......