当前位置: 首页 > 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;【读…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

中医有效性探讨

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