# go-api **Repository Path**: yvandx/api ## Basic Information - **Project Name**: go-api - **Description**: go full api - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-07-08 - **Last Updated**: 2025-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 进度备忘录 第一次联调中发现的问题记录: 1. 明天解决分支机构图片显示问题 # 环境配置 ``` 设置代理 go env -w GOPROXY=https://goproxy.cn,direct ``` # 开源组件及学习文档 ``` 配置文件读取 https://github.com/spf13/viper 记录日志 https://github.com/sirupsen/logrus 日志切割 https://gopkg.in/natefinch/lumberjack.v3 雪花主键 https://github.com/bwmarrin/snowflake web框架 https://github.com/gin-gonic/gin # 数据和相关驱动 https://gorm.io/docs/ go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite go get gorm.io/plugin/soft_delete # list操作 go get github.com/ahmetb/go-linq/v3 # excel处理 go get github.com/xuri/excelize/v2 # rag github.com/amikos-tech/chroma-go github.com/tmc/langchaingo # websocket github.com/gorilla/websocket ``` # 项目目录结构 基本的代码放置规则是: lib 包下对引入的第三方以来进行二次封装,方便使用;lib/utils 里面是无任何第三方以来的自己写的工具类,(后续抽取成一个独立的类似hutool的工具包) repository 编写一些简单的,不需要事务控制的查询方法,例如分页查询等; service 编写通用工具方法,例如递归获取下级目录、权限验证等等,尽量不要将 *gin.Context传递过去。一些后台服务也写在这里。 handler 主要的业务逻辑,包括参数解析,基础业务逻辑处理等。如果遇到业务简单,但是需要事务控制,导致方法特别长的,在同级目录隔壁创建一个 同名小写方法,go文件同名_extend 这里的三层结构只是为了尊重面向对象,方便理解代码。强行分三层结构,*gin.Context不传递到service层的话controller层会需要多写一层 error判断(go没有java的注解机制,虽然能通过中间件实现类似spring的ExceptionHandler的功能,最终效果其实不方便阅读维护)。 而且业务代码的逻辑往往非常简单,多写一层封装方法没必要。 ``` ├─api │ ├─doc 文档目录 │ ├─make 构建脚本目录 │ └─src 代码目录 │ ├─bin 可执行文件目录 │ │ ├─langs // 多语言配置文件 │ │ ├─logs //日志文件 │ │ └─source //静态资源文件 │ ├─cli // 命令行工具 ├─full // 最大的main程序入口,如果是走完整的微服务路线,这个可能是不存在的,还在权衡中!。 ├─global //全局通用代码 │ ├─db //数据库适配层 │ ├─lang //多语言适配层 │ ├─middleware //中间件 │ └─structs //结构体 │ ├─enum //枚举定义 │ ├─lms //在线学习考试模块管理端的结构体 │ ├─study //在线学习考试模块学习端的结构体 │ └─table //数据库表结构 ├─lib // 常用库 │ ├─config // 配置文件 │ ├─file //文件操作 │ ├─jwt // jwt令牌 │ ├─log // 日志 │ └─utils // 其他,该包下不要引入任何第三方依赖 ├─modules // 具体的功能模块 │ ├─lms // 在线学习考试管理模块 │ │ ├─api-router // 路由层,加个api前缀只为为了让它在上面,强迫症犯了 │ │ ├─controller // 控制层,这一层处理和前端的参数交互处理 │ │ ├─repository // 处理和数据库层的交互,本来是打算省略这一层的,想了一下,不应该省略。 │ │ └─service // 逻辑层 │ └─study // 在线学习考试学习模块 └─uint // 测试用例 ``` # go work 的使用 ``` go work use modules_path # eg: go work use modules/idp ,这样写导包路径短一些 ``` # go 编译参数 go build 使用参数 `-ldflags` 在链接阶段向链接器传递参数. `ld`就是链接器的缩写,`flags` 是标志、选项的意思。 `-s` 去掉符号表;`-w` 去掉调试信息,去掉调试信息后一些调试工具就不能使用了。两种方式都能减小执行文件的体积,起到压缩的目的。 `-extldflags=-static` 启用静态编译。 `-X 'miao-client-plugins/project/disk/lib.BuildTime=${BuildTime}'` 编译环节传递变量,通常是版本或者时间等信息。 ```shell # go build -ldflags "-s -w" -o ../plugin/veapp_host.exe ./project/ve-app/main.go ```