03 | fastgo 项目规范及目录结构介绍
提示:
- 所有体系课见专栏:Go 项目开发极速入门实战课;
- 欢迎加入我的训练营:云原生AI实战营,一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营。
为了让你更好的学习本课程。本节课,我来简单介绍下 fastgo 项目的源码组成及目录结构。
目录结构规范
项目开发的第一步便是制定一个合理的目录结构。因为目录结构直接影响着项目的可维护性。
当前社区并没有官方的 Go 项目目录规范。社区中也有不同的目录结构设计方案,当前接受度最高的方案是 golang-standards/project-layout,中文文档为:Go项目标准布局。
很多大型的开源项目都采用了 project-layout
项目所建议的目录规范。
fastgo 项目目录结构介绍
fastgo 项目及云原生 AI 实战营中的所有项目也都采用了 project-layout 目录规范。fastgo 目录结构及说明如下:
├── build.sh* # 构建脚本,用于编译 fg-apiserver 源码
├── cmd/ # 放置可独立运行的可执行程序入口
│ └── fg-apiserver/ # fg-apiserver 服务的主入口目录
│ ├── app/ # 存放与该服务启动配置和初始化相关的代码
│ │ ├── config.go # 读取和管理配置信息的核心逻辑
│ │ ├── options/ # 定义命令行或其他参数选项
│ │ │ └── options.go # 具体的选项结构体及参数解析逻辑
│ │ └── server.go # 启动并运行服务器的核心逻辑
│ └── main.go # 程序入口点,加载配置、启动服务等核心流程
├── configs/ # 配置文件及数据库脚本
│ ├── fastgo.sql # 数据库初始化脚本
│ └── fg-apiserver.yaml # fg-apiserver 服务配置文件
├── docs/ # 项目文档、说明文件或接口文档等
├── go.mod # Go 模块管理文件,记录依赖模块与版本
├── go.sum # 存放 go.mod 中依赖的精确版本哈希
├── go.work # Go 工作区文件,用于管理多个模块
├── go.work.sum # go.work 的依赖校验文件
├── internal/ # 不希望被外部引用的包,存放主要业务逻辑
│ ├── apiserver/ # API 服务器的核心实现
│ │ ├── biz/ # 业务层相关逻辑
│ │ │ ├── biz.go # 核心业务逻辑入口
│ │ │ ├── doc.go # 业务层相关文档注释
│ │ │ ├── README.md # 业务层的说明文档
│ │ │ ├── v1/ # v1 版本的业务实现
│ │ │ │ ├── post/ # 博客相关业务
│ │ │ │ │ └── post.go # 博客业务相关逻辑
│ │ │ │ └── user/ # 用户相关业务
│ │ │ │ └── user.go # 用户业务相关逻辑
│ │ │ └── v2/ # 新版本(v2)业务逻辑(示例或预留)
│ │ ├── handler/ # HTTP 处理层,用于接收、返回数据
│ │ │ ├── handler.go # 通用处理逻辑或公共处理方法
│ │ │ ├── post.go # 博客相关接口的 HTTP 处理函数
│ │ │ └── user.go # 用户相关接口的 HTTP 处理函数
│ │ ├── model/ # 数据模型定义与自动生成的代码
│ │ │ ├── hook.go # 模型钩子函数,如果使用了 GORM hook
│ │ │ ├── post.gen.go # 博客模型的自动生成代码
│ │ │ └── user.gen.go # 用户模型的自动生成代码
│ │ ├── pkg/ # 存放与当前 apiserver 业务紧密相关的通用函数或包
│ │ │ ├── conversion/ # 数据转换,用于结构体之间的转换逻辑
│ │ │ │ ├── post.go # 文章数据转换逻辑
│ │ │ │ └── user.go # 用户数据转换逻辑
│ │ │ └── validation/ # 数据校验相关
│ │ │ ├── post.go # 文章校验逻辑
│ │ │ ├── user.go # 用户校验逻辑
│ │ │ └── validation.go # 通用校验工具和方法
│ │ ├── server.go # 整个 apiserver 的核心启动逻辑
│ │ ├── server.go~ # 临时文件或备份文件
│ │ └── store/ # 数据存储层接口与实现
│ │ ├── doc.go # 存储层文档注释
│ │ ├── logger.go # 存储相关日志逻辑
│ │ ├── post.go # 文章存储操作
│ │ ├── README.md # 存储层的说明文档
│ │ ├── store.go # 存储层接口定义或核心实现
│ │ └── user.go # 用户存储操作
│ └── pkg/ # 内部公共包,通用功能组件
│ ├── contextx/ # 扩展和封装与上下文相关的功能
│ │ ├── contextx.go # 上下文工具函数
│ │ └── doc.go # 文档注释
│ ├── core/ # 核心方法或基础工具
│ │ └── core.go # 核心功能实现
│ ├── errorsx/ # 错误处理扩展
│ │ ├── code.go # 错误码定义
│ │ ├── errorsx.go # 自定义错误类型和逻辑
│ │ ├── post.go # 文章相关错误定义
│ │ └── user.go # 用户相关错误定义
│ ├── known/ # 存放常量或可复用的“已知”配置
│ │ └── known.go # 常量定义
│ ├── middleware/ # HTTP 中间件
│ │ ├── authn.go # 认证相关中间件
│ │ ├── header.go # 处理头部信息的中间件
│ │ └── requestid.go # 处理请求 ID 的中间件
│ └── rid/ # Request ID 生成和管理
│ ├── doc.go # 文档注释
│ ├── rid.go # Request ID 的生成逻辑
│ ├── rid_test.go # 测试文件
│ └── salt.go # 生成 Request ID 时的盐值相关逻辑
├── _output/
│ └── fg-apiserver* # 编译输出的可执行文件
├── pkg/ # 可被对外使用的公共包
│ ├── api/ # API 定义与结构体
│ │ └── apiserver/
│ │ └── v1/
│ │ ├── post.go # v1 版文章相关 API 定义
│ │ └── user.go # v1 版用户相关 API 定义
│ ├── auth/ # 鉴权相关逻辑
│ │ └── authn.go # 登录验证或 Token 验证逻辑
│ ├── options/ # 项目通用选项配置
│ │ └── mysql_options.go # MySQL 连接相关配置
│ ├── token/ # Token 生成、解析等
│ │ ├── doc.go # 文档注释
│ │ ├── token.go # Token 相关主逻辑
│ │ └── token_test.go # 测试文件
│ ├── token~/ # 临时或备份目录
│ │ └── token.go # 备份的 Token 逻辑文件
│ └── version/ # 版本信息
│ ├── doc.go # 文档注释
│ ├── flag.go # 版本标识相关的命令行标识
│ └── version.go # 版本信息相关逻辑
├── README.md # 项目说明文档
└── scripts/ └── test.sh* # 测试命令脚本或自动化测试入口
相关文章:
03 | fastgo 项目规范及目录结构介绍
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入我的训练营:云原生AI实战营,一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营。 为了让你更好的学习本课程。本节课,我来简单介绍下 fastgo…...
K8S学习之基础二十三:k8s的持久化存储之nfs
K8S持久化存储之nfs 在 Kubernetes (k8s) 中使用 NFS(Network File System)作为存储解决方案是一种常见的方式,特别是在需要共享存储的场景中。以下是关于如何在 Kubernetes 中使用 NFS 存储的详细说明: 1. 准备 NFS 服务器 …...
CTF代码学习日记 Python
os模块 在Python中,os是一个内置的标准模块,主要用于与操作系统进行交互,提供了许多操作文件、目录、进程等的功能。 例如: os.mkdir()用于创建新目录os.rmdir()用于删除空目录os.listdir()可以列出指定目录下的所有文件和目录…...
存储优化(protobuf与mmkv)
存储优化(protobuf与mmkv) 在Android应用开发中,数据存储是一个基础且关键的环节。随着应用功能的日益复杂,数据量的增加,传统的存储方式如SharedPreferences、SQLite等在性能上的局限性逐渐显现。本文将深入探讨两种…...
MTK Android12 添加GMS后,报“设备未经过play保护认证“问题
文章目录 问题解决 问题 在MTK平台的Android12机柜上面,客户要求安装GMS。安装后,打开发现报"设备未经过play保护认证"问题,无法使用。解决 路径:/build/make/tools/buildinfo.sh diff --git a/build/make/tools/bui…...
自定义Linux网络协议的开发与测试
在当今快速发展的技术领域中,定制化网络协议可以为特定的应用场景提供灵活而强大的解决方案。本文将详细介绍如何在Linux系统上开发一个自定义网络协议,并编写相应的用户空间程序进行测试。所有步骤基于2025年3月11日的时间点完成。 开发自定义协议内核模块 定义协议和实现…...
Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南
📌 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器,可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…...
说一下spring的事务隔离级别?
大家好,我是锋哥。今天分享关于【说一下spring的事务隔离级别?】面试题。希望对大家有帮助; 说一下spring的事务隔离级别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring的事务隔离级别是指在数据库事务管理中…...
【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用
深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识,都会有新的领悟。大约 2 年前,我曾就这一技术方向撰写过另一篇短文《从类型转换视角,浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…...
C++ Primer Plus第十二章课后习题总结
1. 对于下面的类声明: class Cow {char name[20];char * hobby;double weight;public:Cow();Cow(const char * nm, const char * ho, double wt);Cow(const Cow c&);~Cow();Cow & operator(const Cow & c);void ShowCow() const; // display all cow d…...
Xavier 初始化:深度网络权重初始化的经典之作
Xavier 初始化:深度网络权重初始化的经典之作 发音:美 [zeɪvjər] n.泽维尔(男子名) 在深度学习的发展历程中,权重初始化对神经网络训练的成功至关重要。随机初始化的简单方法在浅层网络中尚可,但在深层…...
【量化策略】动量反转策略
【量化策略】动量反转策略 🚀量化软件开通 🚀量化实战教程 技术背景与应用场景 动量反转策略是一种基于市场行为分析的量化交易策略,它假设股票价格在经历一段时间的持续上涨或下跌后,会出现反转。这种策略适用于那些希望通过…...
菜鸟之路Day23一一JavaScript 入门
菜鸟之路Day23一一JavaScript 入门 作者:blue 时间:2025.3.10 文章目录 菜鸟之路Day23一一JavaScript 入门0.概述1.JS的引入方式2.JS的基础语法2.1输出语句2.2变量2.3数据类型2.4运算符2.5类型转换 3.函数4.JS对象4.1Array对象4.2String对象4.3Js自定义…...
FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求
FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求 0、界面预览00、简介1、编译安装1.1 编辑模块配置文件 2、使用2.1 拨号规则GET 请求POST 请求JSON 数据 2.2 Lua 脚本GET 请求POST 请求JSON 数据 3 、示例3.1 示例 1:提交 CDR 到第三方接口3.2 示例 2…...
TCP/IP原理详细解析
前言 TCP/IP是一种面向连接,可靠的传输,传输数据大小无限制的。通常情况下,系统与系统之间的http连接需要三次握手和四次挥手,这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...
HTTP与HTTPS的深度解析:技术差异、安全机制及应用场景
引言 HTTP(超文本传输协议)作为互联网通信的核心协议,自1991年诞生以来,经历了从HTTP/1.0到HTTP/3的多次迭代。然而,随着网络安全威胁的升级,纯HTTP协议因缺乏加密机制逐渐暴露其局限性。本文将重点解析HT…...
DrissionPage:更高效的动态爬虫实践(实例)
场景分析 代码重构对比 原Requests方案痛点 DrissionPage方案优势 重构后完整代码 关键技术点解析 1. 会话保持与指纹模拟 2. 智能请求重试 3. 反反爬策略 4. 混合模式扩展 性能对比测试 适用场景建议 常见问题解决 场景分析 原代码通过Requests直接调用B站API接…...
Triplet Loss原理及 Python实现
Triplet loss最初是谷歌在 FaceNet: A Unified Embedding for Face Recognition and Clustering 论文中提出的,可以学到较好的人脸的embedding Triplet Loss 是一种用于训练特征嵌入(feature embedding)的损失函数,广泛应用于人脸…...
2025人工智能AI新突破:PINN内嵌物理神经网络火了
最近在淘金的时候发现基于物理信息的神经网络(简称PINN)也是个研究热点,遂研读了几篇经典论文,深觉这也是个好发论文的方向,所以火速整理了一些个人认为很值得一读的PINN论文和同学们分享。 为了方面同学们更好地理解…...
深入探索Matter协议:开发Matter智能家居设备的基本步骤
随着家居智能化程度的提高,智能家居设备之间相互连接的网络虽然提升了家庭便利性,但也变得越来越复杂,难以管理。将亚马逊Alexa、Ring门铃、谷歌Nest Hub和苹果HomeKit等各种设备连接起来,并确保这些不同设备和操作系统能够良好地…...
搜广推校招面经四十五
快手主站推荐算法 这个是做因果选券的,如果大家的工作和这个有关,可以看看 一、有没有分析特征对各个的贡献度,怎么做? 传统的特征重要度衡量方法,就不介绍了。什么基于树模型的、SHAP值、LIME等。 但其实实际工程中…...
python之replace,strip,split命令
1. replace() 方法 功能:替换字符串中的指定子串 语法:str.replace(old, new[, count]) 特点: 全部替换(默认)或指定替换次数区分大小写返回新字符串,原字符串不变 示例: text "Hello…...
C语言处理字符串的十个函数(附带大量实例)
C语言的字符串处理函数主要集中在 <string.h> 头文件中,使用这些函数前必须包含该头文件。 字符串处理函数操作的对象通常是字符串(以 \0 结尾的字符数组),它们极大地方便了文本处理任务。 以下是我们将要讲解的主要函数&…...
【10】单片机编程核心技巧:指令周期与晶振频率
【10】单片机编程核心技巧:指令周期与晶振频率 🌟 核心概念 单片机的运算速度与时间控制,本质上由 指令周期 和 晶振频率 共同决定。理解这两者的关系,是掌握单片机底层控制的关键。 📌 1. 节拍与指令周期 …...
GitLab的Dockerfile 追踪
为了在 GitLab 上准备每个平台的 Docker 镜像文件,并实现完整的 Dockerfile 追踪,可以按照以下步骤进行操作: 项目准备 首先,确保你有一个 GitLab 项目,并且本地已经克隆了该项目的仓库。如果还没有项目,可…...
HTML基础
前言 什么是 HTML? HTML 是一种用于创建网页结构的标记语言,通过标签(Tag)定义内容的结构和呈现方式。 浏览器解析 HTML 文档后,将其渲染为可视化网页。 一、HTML 语法 1. HTML 基本骨架 所有 HTML 文档必须包含以下…...
静态时序分析:无法满足的生成时钟(TIM-255警告、UITE-461或PTE-075错误)
相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在阅读本文前,强烈建议首先阅读介绍生成时钟的文章,尤其是其中关于时钟极性和反相的相关内容。 静态时序分析:SDC约束命令cr…...
SpringBoot日常:集成shareingsphere-jdbc
文章目录 pom依赖application.yml配置log4j2.xml实体类MapperServicecontroller调用插入接口调用查询接口 本章内容我们来聊聊如何将shareingsphere-jdbc集成到我们自己的springboot项目中,本章采用的shareingsphere-jdbc版本是5.1.2,springboot项目是2.…...
Java 生成图形验证码
一、图形验证码的意义 图形验证码是一种广泛应用于互联网领域的安全验证机制,它通过向用户展示包含字符、数字、图形等信息的图片,要求用户正确识别并输入其中的内容,以此来区分用户是人类还是机器程序。图形验证码具有多方面重要意义&#…...
nextjs15简要介绍以及配置eslint和prettier
目录 一、Next.js 何时使用服务器端渲染(SSR)?何时使用静态生成(SSG)? 1、服务器端渲染(SSR - getServerSideProps) 2、 静态生成(SSG - getStaticProps) …...
插入排序算法优化
一 插入排序概述 插入排序是稳定的原地排序算法,核心思想是逐步构建有序序列。对于未排序部分的每个元素,在已排序序列中从后向前扫描,找到合适位置插入。时间复杂度为: 最优:O(n)(已有序) 最差:O(n^2)(完全逆序) 平均:O(n^2) 二 二分查找优化(减少比较次数)…...
python学智能算法(七)|KNN邻近算法
【1】引言 前述学习进程中,已经了解了一些非常经典的智能算法,相关文章包括且不限于: python学智能算法(三)|模拟退火算法:深层分析_模拟退火 动画演示-CSDN博客 python学智能算法(四&#x…...
LabVIEW闭环控制系统硬件选型与实时性能
在LabVIEW闭环控制系统的开发中,硬件选型直接影响系统的实时性、精度与稳定性。需综合考虑数据采集速度(采样率、接口带宽)、计算延迟(算法复杂度、处理器性能)、输出响应时间(执行器延迟、控制周期&#x…...
JavaScript(Web APIs)
这个阶段两天也能看完 目录 壹_DOM-获取元素 00、获取DOM元素(根据CS选择器来获取DOM元素) 01、修改元素内容 02、修改CSS 03、H5自定义属性 04、定时器 贰_DOM-事件基础 00、事件监听 01、事件类型 02、事件对象 03、环境对象 04、回调函数 叁_DOM-事…...
创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程
环境: node v20.18.0 npm 11.1.0 用到的所有依赖: "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…...
机器视觉条形光源应用解析
在机器视觉中,条形光源是一种常见的照明设备,通过其特殊的形状和光路设计,能够有效解决检测中的光照均匀性、反光抑制、对比度增强等问题。以下是关于条形光源的详细解析: 1. 条形光源的基本结构与类型 结构:由多个LED灯珠沿直线或弧形排列,通常封装在长条形外壳中,可单…...
苹果商店上架流程,app上架发布流程
苹果商店地址 https://appstoreconnect.apple.com/login 其他地址:开发 - Apple Developer 1.更新代码 将项目的代码更新到最新,更新成功后右下角会给出提示 2.打开模拟器 鼠标右键可以选择设备(Device) 3.测试运行 如下图可以看到已经识别到设备了,点击运行即可,运行到模…...
大数据技术在土地利用规划中的应用分析
大数据技术在土地利用规划中的应用分析 一、引言 土地利用规划是对一定区域内的土地开发、利用、整治和保护所作出的统筹安排与战略部署,对于实现土地资源的优化配置、保障社会经济的可持续发展具有关键意义。在当今数字化时代,大数据技术凭借其海量数据处理、高效信息挖掘等…...
【Axure资料】110套优质可视化大屏模板+图表组件+科技感元件等
本作品集包含110套高保真可视化大屏模板,以及丰富的图表组件和科技感元件,旨在满足各行业对数据可视化展示的需求。所有模板和组件均基于Axure RP 9软件设计,确保高质量的交互体验和视觉效果。 作品类型:Axure原型模板 兼容版本&…...
TCP-IP协议通信模型
一、TCP/IP协议概述 TCP/IP协议即传输控制协议/互联网协议,也被称为网络通讯协议。它包含了一系列构成互联网基础的网络协议,是Internet的核心协议。 二、TCP/IP协议通信模型 文件中提到了TCP/IP协议通信模型,但未详细展开其具体层次结构和…...
VMware下载安装Ubuntu详解
一、Linux简介 1、不同领域的主流操作系统 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 1.1、桌面操作系统 Windows(用户数量最多)Mac OS(苹果电脑操作系统)Linux(用户数量少) 1.2、服…...
wpf label 内容绑定界面不显示
<Label Content"{Binding LabelText}" /> ... public string LabelText {get;set;}后端改变值后,界面内容并不显示 查看资料后改动如下 private string _labelText; public string LabelText{get { return _labelText; }set { _labelText value; OnPropertyCh…...
VC++ 获取目的IP的路由
GetBestRoute 函数获取到目的IP的最佳匹配路由。 第一个参数为:destination(目的IP) 第二个参数为:source(源IP) 通常不需要指定第二个source,这个一般用来匹配具体某一个网卡接口路由的&…...
海外跨境专线是什么?如何搭建海外跨境专线?
网络跨境专线——这一名词你听说过吗?如果你在跨境经济、国际贸易或网络通信领域工作,那它一定是你日常工作的一个重要话题。今天我们就来聊聊网络跨境专线的概念和搭建方法,希望能够为你在这一领域的探索提供一些帮助。 一、什么是网络跨境…...
【神经网络】python实现神经网络(二)——正向推理的模拟演练
一.神经网络假设 在开始讲解之前,首先我们假设有这样一套神经网络,一共有三层: 其中,关于神经网络的权重、偏置的符号定义如下(如果不知道什么是权重和偏置,可以参考我之前写过的一篇文章:【机器学习】机器学习是什么意思): 以下文章将沿用以上这个设…...
【从零开始学习计算机科学】操作系统(八)IO管理
【从零开始学习计算机科学】操作系统(八)IO管理 IO管理IO设备IO设备的分类IO控制器设备控制器的IO端口编址设备数据传输控制方法缓冲技术缓冲区的分类常用的缓冲技术虚拟设备IO设备的分配IO相关的软件的设计IO管理 IO设备 IO设备就是可以将数据输入到计算机,或者可以接收计…...
MySQL的安装及配置
一.以安装包方式下载 1.进入MySQL官网,下载安装包 官网链接:https://downloads.mysql.com/archives/installer/ 2.安装MySQL 二.压缩包方式下载 下载位置:mysql下载位置 解压缩后位置:D:\mysql-8.0.15-winx64 在主目录下复制…...
macOS 终端优化
macOS 安装、优化、还原、升级 Oh My Zsh 完全指南 🚀 Oh My Zsh 是 macOS 终端增强的利器,它能提供强大的自动补全、主题定制和插件支持,让你的终端更高效、更炫酷。本文将全面介绍 如何安装、优化、还原、重新安装和升级 Oh My Zsh&#x…...
Java三种注释方式
Java有三种注释:单行注释(//,从//到行尾被忽略,用于简单说明),多行注释(/* */,可包含多行内容,用于解释逻辑或禁用代码),文档注释(/**…...
Java 无 GUI 浏览器:HtmlUnit 入门及实战 [特殊字符]
文章目录 HtmlUnit 入门功能简介入门案例更多功能HtmlUnit 实战需求页面分析编码参考⭐ 本文目标: HtmlUnit 框架入门HtmlUnit 框架实战:实现 HtmlUnit 访问 Web 页面,并实现 Web 页面按钮点击,同时获取到下载的文件。HtmlUnit 入门 🚀 官网:https://htmlunit.sourcefo…...