go可以使用go mod init
命令新建一个模块,该命令的参数就是模块名,又称模块路径,例如:example.com/mymodule
。
有小伙伴可能有这样的疑问:这个模块路径需要我们和文件系统里的路径进行对应吗?其实不用。模块路径实际上就是一个标识符,用于在一个项目中唯一的标识、跟踪一个模块。与包Package
联系起来,可以将之理解为包的命名空间。即当我们需要在当前文件中导入一个包时,必须连带着指定该包所属模块。下面来举一个例子:我们创建一个项目,其结构如下:
.
├── go.mod
├── main.go
└── route
└── route.go
假设该项目的模块路径是example/web-server
。main.go的包名是main
自不必说。route.go
的包名是route
。当我们需要在main.go中导入route包时,需要按如下形式进行操作,该包的完整路径中包含了其所属的模块路径:
import "example/web-server/route"
可能还会这样的疑问:为什么我在使用第三方模块的时候,经常看到模块路径是这样的形式github.com/xxa/xxb
,看起来像是Github的仓库地址。这个问题解释起来也很清楚,Golang官方对于模块路径的命名给出了几点建议:
- 模块路径尽量采用
<prefix>/<descriptive-text>
的形式。其中前缀用于指定模块来源,例如可以是该模块的存储库路径,就像之前说到的github.com/xxa/xxb
这种前缀。或者采用一个你能“掌控”的名字,例如公司名、你的域名等,以确保尽可能不会被别人同时采用。至于后面的描述性文本,推荐采用该项目的名称来表示。 - 此外,尽量不要在前缀中使用
test
和example
,test
作为前缀的包惯例上会被用于测试另一个包,至于example
则被大量用于一些文档。