当前位置:首页 > 科技  > 软件

选择正确的Go Module Path,会给你不一样的体验

来源: 责编: 时间:2024-04-10 08:34:45 251观看
导读最近我在查看项目代码时,注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法,相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内

最近我在查看项目代码时,注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法,相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path,但这显然不是Go的推荐写法或惯用法。6kV28资讯网——每日最新资讯28at.com

在这篇简短的文章中,我就来介绍一下module path对Go源码构建、包导入路径以及开发协作的影响,以及符合惯例的module path应该是什么样子的。6kV28资讯网——每日最新资讯28at.com

我们先来复习一下什么是Go module path。6kV28资讯网——每日最新资讯28at.com

1. 什么是module path

在Go语言中,module path(模块路径)是指在Go开发中用来标识和定位模块的唯一字符串,用于指定在远程仓库或本地文件系统中存储模块代码的位置。6kV28资讯网——每日最新资讯28at.com

module path在go.mod文件中定义,比如下面这个示例:6kV28资讯网——每日最新资讯28at.com

// go.modmodule github.com/user/modulego 1.21.1

我们看到:一个典型的模块路径是一个URL格式字符串,可能是类似于github.com/user/module的形式,其中github.com/user/module就是module path。6kV28资讯网——每日最新资讯28at.com

在Go语言中,模块(module)是一种组织和管理代码的方式,也是Go代码版本管理的基本单元,我们可以在模块路径中包含主版本信息,比如:6kV28资讯网——每日最新资讯28at.com

// go.modmodule github.com/user/module/v2go 1.21.1

这表明该模块为v2版本,与前面的github.com/user/module是不向后兼容的两个模块。模块的使用者可以同时导入这两个不兼容的模块下的包,比如:6kV28资讯网——每日最新资讯28at.com

import ( "github.com/user/module/foo" foov2 "github.com/user/module/v2/foo")

那么module path的选取和使用,对Go开发有何影响呢?我们继续向下看。6kV28资讯网——每日最新资讯28at.com

2. module path的影响

2.1 指示Go module网络位置

前面提到过,在Go语言中,我们通常使用模块的存储库地址作为模块路径的基础。这样做的好处是,Go编译器可以直接通过模块路径确定模块在网络上的位置,并从指定的位置下载需要的代码。这使得在使用第三方模块时非常方便,开发者只需要指定模块的路径,Go工具链就能够自动处理依赖关系,下载并编译所需的模块代码。6kV28资讯网——每日最新资讯28at.com

例如,如果一个模块的路径是github.com/user/module,那么Go工具链(尤其是Go编译器)就会认为该模块的代码存储在GitHub上的user用户下的module仓库中。当Go工具链需要引入该模块时,它会根据这个路径通过goproxy或直接去GitHub上下载相应的代码。6kV28资讯网——每日最新资讯28at.com

这种基于存储库地址的模块路径设计简化了模块的管理和依赖关系的处理,使得在Go项目中使用第三方模块变得更加方便和可靠。6kV28资讯网——每日最新资讯28at.com

2.2 对Go包路径的影响

Go module下的包的导入路径为module path+到包所在目录的相对路径,以module path为github.com/user/module的module下的pkg/foo目录下的包为例,foo包的导入路径为github.com/user/module/pkg/foo。6kV28资讯网——每日最新资讯28at.com

而如果像本文开头那样,使用com.example.foo作为module path,那么foo包的导入路径就变为了com.example.foo/pkg/foo,这显然难以理解,同时,com.example.foo这样的Java模式的字符串也无法指示go module的网络位置。6kV28资讯网——每日最新资讯28at.com

2.3 对编译的影响

module path对编译的影响体现在两方面:6kV28资讯网——每日最新资讯28at.com

首先,Go编译时通过module path来查找依赖的模块。如果Go module path不正确或不完整,那么编译可能会失败。非idiomatic的Go module path可能导致编译错误或难以诊断的问题。6kV28资讯网——每日最新资讯28at.com

其次,module path会影响采用go build默认构建出的二进制文件的名字,比如如果一个module path为github.com/user/mymodule,那么在该module下执行go build(不使用-o命令行标志),默认得到的二进制文件名为mymodule。6kV28资讯网——每日最新资讯28at.com

但如果module path为com.example.foo,那么得到的二进制文件名就为com.example.foo,这显然不是我们想要的。6kV28资讯网——每日最新资讯28at.com

2.4 对开发者协作的影响

Go模块路径的命名对开发者之间的协作也有着重要的影响,主要体现在两方面:6kV28资讯网——每日最新资讯28at.com

  • 唯一性和命名空间

模块路径应当保持唯一,以避免与其他模块产生冲突。通常情况下,使用域名作为模块路径的一部分可以确保全球唯一性。在团队内部,也可以基于公司或组织的名称来命名模块路径,以确保模块的唯一性。6kV28资讯网——每日最新资讯28at.com

  • 依赖管理

使用清晰、有意义、可以指示位置和版本的模块路径可以帮助开发者更好地管理依赖关系。当其他开发者在引入你的模块时,他们可以通过模块路径来确定正确的依赖版本,以及如何与你的模块进行集成。6kV28资讯网——每日最新资讯28at.com

3. 如何选择一个好的module path

通过上面的秒数,其实我们已经可以勾勒出一个好的module path的画像了。当然这也是Go社区的最佳实践。6kV28资讯网——每日最新资讯28at.com

通常情况下,module path应该基于模块的存储库地址,并使用简短、易于理解的路径。6kV28资讯网——每日最新资讯28at.com

就像前面提到的那样,如果你的module存储在GitHub上并可公开,那么module path一般是github.com/user/module。6kV28资讯网——每日最新资讯28at.com

如果你的module公司内部,不能公开的,那么可以使用一个私有的存储库地址,例如:company.com/dept/go/module。6kV28资讯网——每日最新资讯28at.com

无论公开的,还是私有的,你都可以定制module path,这方面的方案可以参考我之前编写的有关定制Go module的拉取方案[1]6kV28资讯网——每日最新资讯28at.com

如果是仅在本地使用的日常练习项目,那么Go module path的使用可以宽松一些,可以无需在乎其对go module网络位置、开发者协作的影响,可使用像demo这样的单个词的module path,仅注意下其对包路径和编译结果的影响即可。6kV28资讯网——每日最新资讯28at.com

4. 小结

综上,我们看到:Go module path对Go module网络位置、包路径、编译和开发者协作都有重要影响。遵循Go社区的最佳实践,选择一个好的Go module path可以提高代码可读性和可维护性,并简化多人协作,帮助Go开发者更好地使用Go模块系统。6kV28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82506-0.html选择正确的Go Module Path,会给你不一样的体验

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: ACE 技术将有更多应用:利用逼真数字人 AI 技术增强游戏体验

下一篇: 详解Pinia持久化插件pinia-plugin-persist在Vue3中的应用与实践

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top