优雅组织-Golang-项目结构的指南 (优雅van)
Go语言社区在系统总结之前,由一些开发者总结了像
cmd
和
internal
这样的目录结构。随后,标准Go项目布局对此进行了进一步的概括,该项目已获得了超过4万个star。
尽管其起源是一个提示,但标准布局已经成为Go项目目录结构的事实标准。
目录结构
标准Go项目布局建议使用以下目录结构:
-
cmd
:可执行文件 -
internal
:不应该在包管理器之外导入的包 -
pkg
:构建后的包 -
testdata
:测试数据 -
vendor
:外部依赖项(仅在Go Modules下使用)
cmd
目录
cmd
目录包含项目的可执行文件。每个可执行文件都应该是一个单独的Go包。
internal
目录
internal
目录包含不应该在包管理器之外导入的包。这些包通常与项目的实现细节相关,并且不打算公开给其他包使用。
pkg
目录
pkg
目录包含构建后的包。这个目录是由
go build
命令自动生成的,不应该手动修改。
testdata
目录
testdata
目录包含测试数据。这些数据用于测试项目的包。
vendor
目录
vendor
目录包含外部依赖项。这个目录仅在使用Go Modules时使用。当您使用
go mod init
初始化一个项目时,Go Modules会自动创建此目录。
优点
使用标准Go项目布局有以下优点:- 一致性:它提供了Go项目目录结构的一致标准,这使得更容易在不同的项目之间导航和协作。
- 模块化:它通过将相关文件组织到不同的目录中来促进模块化,这有助于保持项目井然有序。
- 可测试性:它提供了一个明确的位置来存储测试数据,这有助于提高项目的可测试性。
- Go Modules支持:它与Go Modules兼容,Go Modules是Go语言中管理依赖项的首选方法。
结论
标准Go项目布局是组织Go项目目录结构的事实标准。它提供了一致性、模块化、可测试性和Go Modules支持的优点。强烈建议所有Go开发者采用此布局,以改善项目的可维护性和可协作性。golang项目中使用条件编译
golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用可以实现诸如按需编译release和debug版本代码的需求
build tags 是通过代码注释的形式实现的,要写在文件的最顶端;
go build指令在编译项目的时候会检查每一个文件的build tags,用来决定是编译还是跳过该文件
build tags遵循以下规则
示例:
约束此文件只能在支持kqueue的BSD系统上编译
一个文件可能包含多行条件编译注释,比如:
约束该文件在linux/386 或 darwin/386平台编译
需要注意的点
正确的写法如下:
编译方法:
具有_$后缀的go文件在编译的时候会根据当前平台来判断是否将该文件导入并编译;同样适用于处理器架构判断 _$。
两者可以结合起来使用,形式为: _$GOOS_$
示例:
文件名必须提供,如果只由后缀的文件名会被编译器忽略,比如:
这两个文件会被编译器忽略,因为以下划线开头的文件都会被忽略
Golang项目部署3,容器部署
容器部署即使用 docker 化部署 golang 应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。
跨平台交叉编译是 golang 的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题。
使用以下指令可以静态编译 Linux 平台 amd64 架构的可执行文件:
生成的 main 便是我们静态编译的,可部署于 Linux amd64 上的可执行文件。
我们需要将该可执行文件 main 编译生成 docker 镜像,以便于分发及部署。 Golang 的运行环境推荐使用 alpine 基础系统镜像,编译出的容器镜像约为 20MB 左右。
一个参考的 Dockerfile 文件如下:
其中,我们的基础镜像使用了 loads/alpine:3.8 ,中国国内的用户推荐使用该基础镜像,基础镜像的 Dockerfile 地址:,仓库地址:
随后使用 docker build -t main . 指令编译生成名为 main 的 docker 镜像。
需要注意的是,在某些项目的架构设计中, 静态文件 和 配置文件 可能不会随着镜像进行编译发布,而是分开进行管理和发布。
例如,使用 MVVM 模式的项目中(例如使用 vue 框架),往往是前后端非常独立的,因此在镜像中往往并不会包含 public 目录。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的项目中,也往往并不需要 config 目录。
因此对于以上示例的 Dockerfile 的使用,仅作参考,根据实际情况请进行必要的调整。
使用以下指令可直接运行刚才编译成的镜像:
容器的分发可以使用 docker 官方的平台:,国内也可以考虑使用阿里云:。
在企业级生产环境中, docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用。 容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。