go项目的搭建是非常简单的,你随便找一个空文件夹,创建一个go.mod文件和一个main.go文件,一个最简易的项目就出来了,你可以围绕main.go不断拓展你的业务,但是,这并不适合项目膨胀。
在提到项目文件结构之前,我想先对go.mod做几点标记。
首先,mod文件应该放在你的项目的根目录下,不要将他放到项目中的哪个文件夹下,对于整个项目而言,go.mod所在的位置就是项目根路径,对于同项目不同包的引用都是参照go.mod的位置和包声明的。
比如,go.mod文件内容如下:
module example.com go 1.18
那么当你在/RootPath/cmd/myentry/main.go
中对/RootPath/internal/decrypt/decrypt.go
中的函数Decrypt()
进行调用时,你就需要在main.go
中这么引用:"example.com/internal/decrypt
",而使用时则是decrypt.Decrypt()
这种包名+具体函数名的方式来调用。
另外,go.mod和GOPATH
是冲突的,当你在根路径下创建了go.mod后,如果GOPATH
也指向根目录,就会出现一些错误。
这也是有些人会将go.mod放在.../src/
下的原因。
事实上,GOPATH
的作用现在已经基本只剩下构建项目后保存的路径这么个作用了(当然,如果你删除go.mod并且将go的环境变量GO111MODULE
设置为off的话,你依然可以使用GOPATH
作为主要的项目路径。
对于使用go.mod
又希望编译结果放在根目录下/bin
路径下的使用者来说,可以通过设置go的环境变量GOBIN
来实现这一目的,不过这样设置对于不同项目来说都会指向同一个路径。
我的建议是将GOPATH
指向项目根路径下的/build
路径。
上面我提到了一些子路径,如此这般的项目整体规划并不是规定,也不是规则,更不是官方的建议。
对于项目如何搭建、文件结构如何设计,其实都是开发者自己的选择和体验。
甚至,对于小型项目、玩具项目,你甚至不必去管文件结构。那只是种费力不讨好的事情。还有可能消耗掉新手对于这门语言的耐性。
事实上,go项目的开发是非常简单且不需要过多的准备工作的。
正如上一节所言,你只需要一个go.mod用于声明项目的总名,一个有main()函数入口的的go文件,你就可以愉快的开始开发了。
执行的时候更是只需要go run main.go
就可以得到运行结果。
你甚至不需要IDE。
但是,如果你对于项目的迭代、膨胀是有预期的,且项目内容比较多以至于如果不进行项目管理、文件结构设计的话,会让开发体验降低,那么我比较推荐你学习一下这篇文章中的项目结构规范。
Standard Go Project Layout(简体中文版)
再强调一遍,这不是规定、也不是规则、更不是建议,作为参考即可。
我在这里也做了个简单的总结:
/* --Project path --bin 可执行文件 --build 编译构建结果 --cmd 代码,甚至可以只有一个main --具体包名 --config 配置文件 --docs 文档文件 --example 样例应用程序 --internal 不便在cmd做展示的、需要隐藏的、需要加密的代码 --pkg 外部应用程序使用的代码库 --script 脚本 --test 测试代码 --tools 编写的工具,可以从pkg、internal引入代码 --vender 应用程序依赖项 go.mod */
或许你会注意到,这里并没有/src路径的座位,这是因为src是java的编程习惯,java通过src分割了框架在做的事情,和开发者写下的事情。
而Go由于模块引入的便捷,以及语言本身的特性,其实并不需要这么做。
对于上面这样的文件结构设计来说,cmd并不会存放太多的代码,大多数的代码都放在了internal(需要保证私有性的)、tools、vender、pkg中。
当然,即便是用了src作为具体代码路径,也不会产生什么影响。
go build
可以对目标包、目标go文件进行编译,生成可执行文件
go install
可以对指定的包进行完整编译,生成可执行文件到GOPATH/bin路径下,对于没有下载的依赖项也会进行下载操作。
具体的命令使用就不多赘述了。