当前位置: 首页 > news >正文

golang项目目录推荐

序言

逛GitHub的时候发现有个4.5k对goalng项目结构的推荐的项目,这里就简单的推荐下

文件目录

/cmd

项目主要的应用程序。

对于每个应用程序来说这个目录的名字应该和项目可执行文件的名字相匹(例如,/cmd/myapp)。不要在这个目录中放太多的代码。如果目录中的代码可以被其他项目导入并使用,那么应该把他们放在/pkg目录。如果目录中的代码不可重用,或者不希望被他人使用,应该将代码放在/internal目录。显式地表明意图比较好!

通常来说,项目都应该拥有一个小的main函数,并在main函数中导入或者调用/internal/pkg目录中的代码。

/internal

私有的应用程序代码库。

这些是不希望被其他人导入的代码。请注意:这种模式是Go编译器强制执行的。详细内容情况Go 1.4的release notes。再次注意,在项目的目录树中的任意位置都可以有internal目录,而不仅仅是在顶级目录中。可以在内部代码包中添加一些额外的结构,来分隔共享和非共享的内部代码。这不是必选项(尤其是在小项目中),但是有一个直观的包用途是很棒的。应用程序实际的代码可以放在/internal/app目录(如,internal/app/myapp),而应用程序的共享代码放在/internal/pkg目录(如,internal/pkg/myprivlib)中。

/pkg

外部应用程序可以使用的库代码(如,/pkg/mypubliclib)。

其他项目将会导入这些库来保证项目可以正常运行,所以在将代码放在这里前,一定要三思而行。请注意,internal目录是一个更好的选择来确保项目私有代码不会被其他人导入,因为这是Go强制执行的。使用/pkg目录来明确表示代码可以被其他人安全的导入仍然是一个好方式。

/vendor

应用程序的依赖关系(通过手动或者使用喜欢的依赖管理工具,如新增的内置Go Modules特性)。

执行go mod vendor命令将会在项目中创建/vendor目录,注意,如果使用的不是Go 1.14版本,在执行go build进行编译时,需要添加-mod=vendor命令行选项,因为它不是默认选项。构建库文件时,不要提交应用程序依赖项。请注意,从1.13开始,Go也启动了模块代理特性(使用https://proxy.golang.org作为默认的模块代理服务器)。

服务端应用程序的目录

/api

OpenAPI/Swagger规范,JSON模式文件,协议定义文件。

Web应用程序的目录

/web

Web应用程序特定的组件:静态Web资源,服务器端模板和单页应用(Single-Page App,SPA)。

通用应用程序的目录

/configs

配置文件模板或默认配置。

confd或者consul-template文件放在这里。

/init

系统初始化(systemd、upstart、sysv)和进程管理(runit、supervisord)配置。

/scripts

用于执行各种构建,安装,分析等操作的脚本。

/build

打包和持续集成。

将云(AMI),容器(Docker),操作系统(deb,rpm,pkg)软件包配置和脚本放在/build/package目录中。将CI(travis、circle、drone)配置文件和就脚本放在build/ci目录中。请注意,有一些CI工具(如,travis CI)对于配置文件的位置有严格的要求。尝试将配置文件放在/build/ci目录,然后链接到CI工具想要的位置。

/deployments

IaaS,PaaS,系统和容器编排部署配置和模板(docker-compose,kubernetes/helm,mesos,terraform,bosh)。请注意,在某些存储库中(尤其是使用kubernetes部署的应用程序),该目录的名字是/deploy

/test

外部测试应用程序和测试数据。随时根据需要构建/test目录。对于较大的项目,有一个数据子目录更好一些。例如,如果需要Go忽略目录中的内容,则可以使用/test/data/test/testdata这样的目录名字。请注意,Go还将忽略以“.”或“_”开头的目录或文件,因此可以更具灵活性的来命名测试数据目录。

其他

/docs

设计和用户文档(除了godoc生成的文档)。

/tools

此项目的支持工具。请注意,这些工具可以从/pkg/internal目录导入代码。

/examples

应用程序或公共库的示例。

/third_party

外部辅助工具,fork的代码和其他第三方工具(例如Swagger UI)。

/githooks

Git的钩子。

/assets

项目中使用的其他资源(图像,Logo等)。

/website

如果不使用Github pages,则在这里放置项目的网站数据。

不应该出现的目录

/src

有一些Go项目确实包含src文件夹,但通常只有在开发者是从Java(这是Java中一个通用的模式)转过来的情况下才会有。如果可以的话请不要使用这种Java模式。你肯定不希望你的Go代码和项目看起来像Java。

不要将项目级别的/src目录与Go用于其工作空间的/src目录混淆,就像How to Write Go Code中描述的那样。$GOPATH环境变量指向当前的工作空间(默认情况下指向非Windows系统中的$HOME/go)。此工作空间包括顶级/pkg/bin/src目录。实际的项目最终变成/src下的子目录。因此,如果项目中有/src目录,则项目路径将会变成:/some/path/to/workspace/src/your_project/src/your_code.go。请注意,使用Go 1.11,可以将项目放在GOPATH之外,但这并不意味着使用此布局模式是个好主意。

项目地址

https://github.com/golang-standards/project-layout

相关文章:

golang项目目录推荐

序言 逛GitHub的时候发现有个4.5k对goalng项目结构的推荐的项目,这里就简单的推荐下 文件目录 /cmd 项目主要的应用程序。 对于每个应用程序来说这个目录的名字应该和项目可执行文件的名字相匹(例如,/cmd/myapp)。不要在这个…...

Maven scope属性解读和使用注意事项

目录 compile runtime test system provided import dependencyManagement标签介绍 maven的scope有哪些&#xff1a; maven的scope一共包括&#xff1a;compile、runtime、test、system、provided、import。 compile <dependency><groupId>org.apache.htt…...

Vue3使用 xx UI解决布局高度自适应

解决方案 在相应的Sider部分添加&#xff1a;height: ‘91.8vh’&#xff0c;即可。示例&#xff1a; <Layout><Sider hide-trigger :style"{background: #fff, height: 91.8vh}"> }知识补充 vw、vh、vmin、vmax是一种视窗单位&#xff0c;也是相对单…...

九牧:科技卫浴,长期主义

“没有做错什么&#xff0c;但却输给了时代”&#xff0c;这是人们给当年手机巨头诺基亚的注解。 谁也没有想到&#xff0c;曾在手机行业称雄的诺基亚&#xff0c;最终败给了时代。当年&#xff0c;在2G向3G、4G跨越的时候&#xff0c;苹果、微软的iOS和安卓系统将手机从简单的…...

中级软件设计师-note-2

一个逆向思维的例子是 “当遇到一个问题时&#xff0c;通常人们会想办法解决这个问题。但逆向思维是指反过来考虑&#xff0c;即想办法制造更多的问题。 举个例子&#xff0c;假设有一个团队正在开发一款新的智能手机。传统的思维方式可能是专注于如何增加手机的功能&#xf…...

解锁商业宝藏:迅软科技答疑保护商业秘密的重要性

商业秘密指不为公众所知悉、具有商业价值并经权利人采取相应保密措施的技术信息、经营信息等商业信息&#xff0c;一旦泄露可能会给公司带来极大的经济损失和竞争压力&#xff0c;保护商业秘密既能维护企业自身合法权益&#xff0c;也能保障市场经济长期健康发展需求。 保护商…...

【GIT】撤销命令

git add 撤销 add 错误文件&#xff0c;撤销掉add列表的文件使用&#xff1a; git reset [文件名] 撤销单个文件 git reset . 撤销全部 git commit 撤销 commit 之后&#xff0c;但是还没有push 可以用撤回刚刚的commit 记录 git reset HEAD~ git log -v 查看提交记录...

开发知识点-09Rust

Rust Rust 语言通常用于编写系统级软件、网络服务器和高性能应用程序&#xff0c;它具有以下特点&#xff1a;1. 高性能和内存安全&#xff1a;Rust 在保证高性能的同时&#xff0c;利用其所有权模型和借用检查器等特性确保内存安全&#xff0c;避免了 C/C 等语言的内存错误和崩…...

Android开发中,百度语音集成之一

我们在开发中&#xff0c;用到实时语音的时候&#xff0c;会有讯飞、百度、阿里&#xff0c;今天主要讲解的是百度语音之语音合成&#xff1a; public class YuYinUtil { private static final Logger logger LogManager.getLogger(YuYinUtil.class); public static final St…...

nodejs连接mongodb报错SyntaxError: Unexpected token .

nodejs连接mongodb报错SyntaxError: Unexpected token 如下图 经过排查&#xff0c;原因是npm默认安装的mongodb插件是最新版6.3.0 &#xff0c;而mongodb数据库版本是4.0.0 &#xff0c;两者版本不同导致nodejs报错。 解决方法是npm卸载新版本的mongodb插件&#xff0c;再安…...

Ubuntu 常用命令之 gunzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 gunzip是一个在Ubuntu系统下用于解压缩文件的命令。它主要用于解压.gz格式的文件。这个命令是gzip命令的反向操作&#xff0c;gzip用于压缩文件&#xff0c;而gunzip则用于解压缩文件。 gunzip命令的参数有 -c 或 --stdout 或 -…...

sun.misc.BASE64Encoder 进行maven打包时报错

报错如下&#xff1a; 报错代码&#xff0c;是因为引用了sun.misc.BASE64Decoder等类不属于JDK标准库范畴&#xff0c;但在JDK中包含了该类&#xff0c;可以直接使用。在jdk1.9中就不存在了。 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;BASE64Encoder enc…...

[DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案

[网络故障] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案 问题描述 最近&#xff0c;我在使用CSDN插件浏览 MOOC 网站时&#xff0c;遇到了一些网络故障。具体表现为&#xff1a; MOOC 中国大学慕课网&#xff1a;www.icourse163.org点击CSDN插件首页的 MOOC&#xff08…...

CSS设计器的使用

目录 css的概念 css的优势 css的基本语法 html中引入css样式 CSS基本选择器 选择器的使用 初级选择器&#xff1a; 标签选择器 类选择器 id选择器 高级选择器(结构选择器&#xff09; ①后代选择器(E F) ②子选择器(E>F) ③相邻兄弟选择器(EF) ④通用兄弟选择器(…...

3d渲染太慢怎么办?2024效果图云渲染AI加速来袭

在不断变革的数码技术世界中&#xff0c;三维渲染技术在影视制作、游戏开发以及建筑设计等多个领域得到了广泛运用。然而&#xff0c;高清质量的三维项目的离线渲染时间长久一直是困扰 CG 工作者的一大难题。通常来讲&#xff0c;渲染一帧画面可能需要几分钟到几小时&#xff0…...

指针函数函数指针回调函数相关知识

指针函数&#xff1a; 本质上是一个函数&#xff0c;返回值是一个指针类型&#xff1b;不能返回局部变量的地址&#xff0c;因为其所存储在栈区&#xff0c;在函数调用结束时&#xff0c;被OS回收了&#xff1b;可以返回的情况&#xff1a;全局变量的地址、static修饰的局部变…...

软件设计模式:六大设计原则

文章目录 前言一、开闭原则二、里氏替换原则三、依赖倒转原则四、接口隔离五、迪米特法则六、合成复用原则总结 前言 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&am…...

Unity闪屏Logo去除

1.新建一个C#脚本&#xff0c;命名为 “SkipSplashScreen” &#xff08;代码如下&#xff09;。 using System.Collections; using System.Collections.Generic; using System; using UnityEngine; using UnityEngine.UI;#if !UNITY_EDITOR using UnityEngine; using UnityEn…...

Git账户密码http方式的配置

Git账户密码http方式的配置 入门 git在提交时每次都需要输入密码和账号信息&#xff0c;可以将账号和密码进行持久化存储&#xff0c; 当git push的时候输入一次用户名和密码就会被记录&#xff0c; 不需要每次输入&#xff0c;提高效率&#xff0c;进行一下配置&#xff1…...

【JUC】三十二、邮戳锁StampedLock

文章目录 1、邮戳锁2、锁饥饿问题的解决思路3、邮戳锁的特点4、代码演示&#xff1a;邮戳锁的传统读写用法5、代码演示&#xff1a;邮戳锁之乐观读6、邮戳锁的缺点7、终章回顾 前面提到了从无锁 ⇒ 独占锁 ⇒ 读写锁&#xff0c;但读写锁存在写锁饥饿的情况。 &#x1f4d5;【读…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...