当前位置:首页 > 数码 > 优雅组织-Golang-项目结构的指南 (优雅van)

优雅组织-Golang-项目结构的指南 (优雅van)

admin5个月前 (05-04)数码20

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 的使用,仅作参考,根据实际情况请进行必要的调整。

使用以下指令可直接运行刚才编译成的镜像:

Golang

容器的分发可以使用 docker 官方的平台:,国内也可以考虑使用阿里云:。

在企业级生产环境中, docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用。 容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Golang

“优雅组织-Golang-项目结构的指南 (优雅van)” 的相关文章

慢聊Golang协程池Ants实现原理 (音乐慢慢摇我俩慢慢聊)

慢聊Golang协程池Ants实现原理 (音乐慢慢摇我俩慢慢聊)

简介 协程是 Go Lang 中的轻量级线程实现,由 Go 运行时 (runtime) 管理。Go 程序会智能地将协程中的任务合理地分配给每个 CPU。创建一个协程的大小约为 2kb,非常节省机...

中的字符串-Golang-拥抱最佳通常-防止经常出现陷阱 (linux替换文件中的字符串)

中的字符串-Golang-拥抱最佳通常-防止经常出现陷阱 (linux替换文件中的字符串)

在这篇文章中,咱们将讨论Golang中的字符串,并检查一些不同的场景,以防止经常出现失误。让咱们深化讨论! 1.字符串能否可以为nil? 咱们曾经对Golang中的字符串有了基本的了...

使用-Golang-个库-进行自动化的-20 (使用goldwave软件编辑某音频文件)

使用-Golang-个库-进行自动化的-20 (使用goldwave软件编辑某音频文件)

简介 Golang(又名Go)是一种静态类型编译型编程语言,因其在并发编程、废品回收和代码可维护性方面的优势而备受推崇。它凭借卓越的性能、强大的并发支持和简洁的语法,已成为自动化任务的热门选...

深化探求-中的追加操作-APPEND函数及其外部上班原理来高效地裁减-了解如何经常使用-Golang-Go-容器 (深化要求)

深化探求-中的追加操作-APPEND函数及其外部上班原理来高效地裁减-了解如何经常使用-Golang-Go-容器 (深化要求)

经过实践示例探求Golang中的追加操作 简介 在Golang编程畛域,操作是一种多才多艺的工具,使开发人员能够灵活裁减切片、数组、文件和字符串。在这篇正式的博客文章中,咱们将踏上一段...

Bytes-Golang-包详解之-Bytes.Buffer-中 (byte数据类型)

Bytes-Golang-包详解之-Bytes.Buffer-中 (byte数据类型)

上篇文章具体解说了一次性性明码OTP相关的常识,基于时期的一次性性明码TOTP是OTP的一种成功方式。这种方法的优势是不依赖网络,因此即使在没有网络的状况下,用户也可以生成明码。所以这种方式被许多...

中备受争议的失误处置机制-Golang-深化讨论 (中备受争议的成语)

中备受争议的失误处置机制-Golang-深化讨论 (中备受争议的成语)

一、error是什么? 在C中,前往失误经过errno.h中的失误代码来示意,比如0代表Noerror,也就是没有失误;2代表Nosuchfileordirectory,也就是找不到指定门路...

经常使用-Golang-战略和最佳通常高效处置一百万个恳求 (经常使用硅胶倒模能起到锻炼的作用吗)

经常使用-Golang-战略和最佳通常高效处置一百万个恳求 (经常使用硅胶倒模能起到锻炼的作用吗)

有效处置一百万个恳求的战略与最佳通常 在一直开展的Web运行程序畛域,处置大规模恳求的才干是成功的关键要素。作为一名全栈开发人员,您或许相熟Golang的效率和性能。在本文中,咱们将深化讨...