Go 1.18:项目搭建、项目结构和项目编译(windows)

项目搭建

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路径下,对于没有下载的依赖项也会进行下载操作。

具体的命令使用就不多赘述了。

posted @ 2022-04-02 23:40  不正游侠  阅读(1528)  评论(0编辑  收藏  举报