Skip to content

编码规范

GizClaw 是 Go-first、但并非 Go-only 的仓库。代码、Schema、生成 SDK、C binding、Wails 前端和文档共同组成一个产品 contract;编码时必须同时维护其实际跨越的边界。

选择对应规范

改动范围编码规范
Go package、服务、并发与生命周期Go
JavaScript、TypeScript、SDK 与前端JavaScript 与 TypeScript
Dart SDK 与 Flutter AppDart 与 Flutter
C SDK、C binding 与 cgo bridgeC 与 cgo
Guide、README、配置说明与架构文档文档

通用规则

先确定所有权

新代码必须放进拥有该行为的 package 或目录。不要因为调用方便,把 provider-specific、产品资源、传输细节或持久化逻辑扩散到通用 abstraction。

公开 API 应保持最小。只在 package 外部调用方确实需要时导出类型或函数;独立 package 的公开符号由 Go doc 或生成 Reference 说明,开发指引负责解释模块职责和边界。

Contract 只有一个源头

OpenAPI、Protobuf 和其他 Schema 是生成 surface 的 source of truth。修改 contract 时,应修改源 Schema、重新生成提交到仓库的产物,并同步验证 Go、JavaScript、C 和实际调用方。不得直接把生成文件当作源代码维护。

外部输入不可信

HTTP、RPC、事件流、配置、固件、SDK payload、workflow input 和跨语言 buffer 都必须在所属边界校验。解析失败、取消、超时、部分初始化和连接关闭应有明确行为。

生命周期必须闭合

创建 goroutine、stream、subscription、timer、文件、网络连接、native handle 或 buffer 的代码,也必须定义取消、关闭和失败清理路径。资源的创建者不一定是关闭者,但关闭所有权必须唯一且清楚。

测试跟随风险

测试验证可观察行为,而不是机械追求每个文件一个测试。纯逻辑优先使用 unit test;跨 package、Schema、网络、存储和运行时边界使用 integration 或 E2E;并发与长期运行组件需要覆盖取消、泄漏和竞态风险。

提交前最低检查

  • 格式化所有修改过的源文件。
  • 运行改动所属 package 已定义的 build、test 或生成命令。
  • Go 行为改动默认运行 go test ./...;只有改动确实局部时才使用更窄范围,并说明原因。
  • Contract 改动重新生成并验证所有受影响语言 surface。
  • 文档与配置改动至少运行 git diff --check,并验证新增链接和命令。
  • 不提交 secret、credential、日志、缓存、临时文件、构建产物或无关改动。