183 lines
3.1 KiB
Markdown
183 lines
3.1 KiB
Markdown
|
# GoAIDB 编码与代码风格指南
|
|||
|
|
|||
|
## 目标
|
|||
|
制定统一的编码规范,确保代码质量、可读性和可维护性。
|
|||
|
|
|||
|
## 适用范围
|
|||
|
适用于本项目所有Go语言代码的编写和维护。
|
|||
|
|
|||
|
## 通用原则
|
|||
|
1. 保持代码简洁清晰
|
|||
|
2. 写好注释,特别是业务逻辑复杂的部分
|
|||
|
3. 遵循最小化接口原则
|
|||
|
4. 异常处理要全面
|
|||
|
5. 内存管理要谨慎
|
|||
|
|
|||
|
## 命名规范
|
|||
|
### 包命名
|
|||
|
- 使用小写
|
|||
|
- 简短且具有描述性
|
|||
|
- 不使用下划线
|
|||
|
|
|||
|
```go
|
|||
|
// 正确示例
|
|||
|
datastorage
|
|||
|
queryprocessor
|
|||
|
|
|||
|
// 错误示例
|
|||
|
DataStorage // 不应该大写
|
|||
|
very_long_package_name // 太长了
|
|||
|
```
|
|||
|
|
|||
|
### 变量命名
|
|||
|
- 使用驼峰式命名法(CamelCase)
|
|||
|
- 名称应明确表达变量含义
|
|||
|
- 局部变量可以简短些,但不得影响理解
|
|||
|
|
|||
|
```go
|
|||
|
// 正确示例
|
|||
|
userName
|
|||
|
connectionPool
|
|||
|
|
|||
|
// 错误示例
|
|||
|
unm // 含义不明
|
|||
|
cp // 含义不明
|
|||
|
```
|
|||
|
|
|||
|
### 函数命名
|
|||
|
- 动词+名词形式
|
|||
|
- 保持一致性
|
|||
|
- 清晰表达函数作用
|
|||
|
|
|||
|
```go
|
|||
|
// 正确示例
|
|||
|
CalculateUserRank()
|
|||
|
ProcessQueryRequest()
|
|||
|
|
|||
|
// 错误示例
|
|||
|
UserRank() // 动作不明确
|
|||
|
DoSomething() // 含义模糊
|
|||
|
```
|
|||
|
|
|||
|
## 格式规范
|
|||
|
### 缩进
|
|||
|
- 使用4个空格缩进
|
|||
|
- 不使用Tab
|
|||
|
|
|||
|
### 行长度
|
|||
|
- 每行不超过80个字符
|
|||
|
- 特殊情况(如长URL)例外
|
|||
|
|
|||
|
### 空格
|
|||
|
- 运算符两侧加空格
|
|||
|
- 逗号后加空格
|
|||
|
- 冒号后加空格
|
|||
|
|
|||
|
```go
|
|||
|
// 正确示例
|
|||
|
result := a + b
|
|||
|
args := make([]string, 0, 10)
|
|||
|
|
|||
|
// 错误示例
|
|||
|
result:=a+b
|
|||
|
args:=make([]string,0,10)
|
|||
|
```
|
|||
|
|
|||
|
### 括号
|
|||
|
- 左括号不要独占一行
|
|||
|
- 控制结构必须使用括号
|
|||
|
|
|||
|
```go
|
|||
|
// 正确示例
|
|||
|
if condition {
|
|||
|
// do something
|
|||
|
}
|
|||
|
|
|||
|
// 错误示例
|
|||
|
if condition
|
|||
|
{
|
|||
|
// do something
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 注释规范
|
|||
|
### 文件头注释
|
|||
|
每个源文件都应包含以下信息:
|
|||
|
- 文件功能说明
|
|||
|
- 创建日期
|
|||
|
- 创建人
|
|||
|
- 修改记录(如有)
|
|||
|
|
|||
|
```go
|
|||
|
/*
|
|||
|
* @file: server.go
|
|||
|
* @description: TCP服务器核心实现
|
|||
|
* @author: 开发者姓名
|
|||
|
* @date: 2023-06-01
|
|||
|
*/
|
|||
|
```
|
|||
|
|
|||
|
### 函数注释
|
|||
|
- 所有导出函数必须添加注释
|
|||
|
- 使用Godoc标准格式
|
|||
|
|
|||
|
```go
|
|||
|
// ProcessQuery 处理客户端查询请求
|
|||
|
// 参数:
|
|||
|
// query - 查询语句
|
|||
|
// 返回值:
|
|||
|
// Result - 查询结果
|
|||
|
// error - 错误信息
|
|||
|
func ProcessQuery(query string) (Result, error) {
|
|||
|
// 函数实现
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 行内注释
|
|||
|
- 解释复杂逻辑
|
|||
|
- 标记待办事项
|
|||
|
|
|||
|
```go
|
|||
|
// TODO: 优化性能
|
|||
|
// HACK: 临时解决方案
|
|||
|
// FIXME: 需要修复的问题
|
|||
|
```
|
|||
|
|
|||
|
## 错误处理
|
|||
|
- 所有错误必须检查
|
|||
|
- 提供有意义的错误信息
|
|||
|
- 统一错误处理机制
|
|||
|
|
|||
|
```go
|
|||
|
// 正确示例
|
|||
|
if err != nil {
|
|||
|
log.Errorf("查询处理失败: %v", err)
|
|||
|
return nil, fmt.Errorf("query processing failed: %w", err)
|
|||
|
}
|
|||
|
|
|||
|
// 错误示例
|
|||
|
if err != nil {
|
|||
|
return nil // 静默忽略错误
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 测试规范
|
|||
|
- 所有关键功能必须有单元测试
|
|||
|
- 测试用例覆盖主要分支
|
|||
|
- 测试文件以_test.go结尾
|
|||
|
|
|||
|
## Git提交规范
|
|||
|
- 提交信息清晰明了
|
|||
|
- 推荐格式: [模块] 操作描述
|
|||
|
|
|||
|
```text
|
|||
|
[server] 修复连接池泄漏问题
|
|||
|
[parser] 支持新的查询语法
|
|||
|
```
|
|||
|
|
|||
|
## 其他建议
|
|||
|
- 保持函数单一职责
|
|||
|
- 控制函数长度不超过50行
|
|||
|
- 使用设计模式提高扩展性
|
|||
|
- 定期重构优化代码结构
|
|||
|
- 使用静态分析工具检查代码
|