
数据库客户端桌面应用MCP 服务【免费下载链接】GoNaviHigh-performance multi-data-source database client — ~30MB, AI MCP ready, zero Electron bloat. | 高性能多数据源数据库客户端约 30MBAI 与 MCP 就绪告别 Electron 膨胀。项目地址https://gitcode.com/gh_mirrors/go/GoNavi点击查看免费下载GoNavi 是一个约 30MB 的高性能多数据源数据库客户端后端以 Go 构建并借助 Wails 绑定前端。本文基于仓库根目录的 GO_STYLE.mdGoNavi 专属 Go 编码手册展开逐一拆解其 14 个章节的强制/推荐条款并结合internal/db、internal/app、internal/connection等核心源码与测试用例说明每条规范在真实代码中如何落地、为何如此设计。读完本文你将掌握在 GoNavi 仓库中新增驱动、扩展 Wails 绑定方法、写并发查询与测试时的完整规范路径以及如何判断自己的代码是否达到可提交标准。一、手册定位GoNavi 不套《阿里巴巴 Java 开发手册》手册开篇即划清边界Java 小工具遵循《阿里巴巴 Java 开发手册》但Go 不套那本手册——因为 Go 没有 package、error、goroutine、interface 这一套 Java 模型。GoNavi 的 Go 代码有自己的底本当规范冲突时按如下优先级裁决本手册的 GoNavi 叠加条款Wails 绑定、驱动、i18n、拆分限额Uber Go Style GuideGoogle Go Style Guide 与 Go Code Review CommentsEffective Go手册内所有条款带三级标记【强制】必须执行、【推荐】默认执行、【参考】有充分理由才可偏离。适用范围是仓库内自有 Go 代码third_party/、生成代码、frontend/wailsjs下的 Wails 生成绑定除外——后者由工具生成人工约束不适用。手册同时被 AGENTS.md、CLAUDE.md 等 AI 协作入口指向是全仓库 AI 编码的唯一规范来源不要另写一套。二、包、目录与文件布局即架构强制条款包名全小写、单数、短不含下划线/驼峰。用db、app、sqlaudit不用db_utils、common、util这类垃圾桶包。包名不与导出类型抢词package redistype Client而不是package redistype RedisClient历史名保持兼容新增禁止口吃。标准布局internal/appWails /App绑定层保持薄internal/dbDatabase契约与*_impl.go驱动实现internal/connection跨层 DTO含QueryResult其余领域包internal/ai、internal/sync、internal/logger、internal/sqlaudit等。文件命名methods_领域.go、引擎_impl.go、主题_平台.go。平台后缀只用windows/darwin/linux/stub/nonwindows这类已有约定例如 agent_process_stub.go 头部就是//go:build !windows。一个文件一个主题新建生产文件建议 ≤400 行、硬上限 800 行函数体建议 ≤80 行、硬上限 120 行。禁止继续膨胀internal/app/methods_file.go、methods_db.go、app.go这三个历史大文件不再新增逻辑新逻辑进新文件旧文件只接线。推荐条款驱动过大时按 catalog / query / exec / ssh / ddl 拆文件包名仍为db不要为拆文件而新建循环依赖包。这在源码中体现为internal/db下大量mysql_impl.go、mariadb_impl.go、tdengine_impl.go等按引擎拆分文件的模式。三、命名规范导出用 MixedCaps、未导出用 mixedCaps缩写保持惯用大小写HTTP、URL、ID、JSON、SQL、SSH、DSN、TTL写httpURL而不是httpUrl。接收者短且一致func (a *App)、func (m *MySQLDB)同一文件内不要混用this/self。Getter 不加Getfunc (c Config) Timeout()不是GetTimeout()。Wails 已有的DBGetTables这类对外 RPC 名保持不变内部新 API 不再造GetXxx。错误变量errXxx哨兵错误var ErrXxx errors.New(...)。测试命名TestXxx、BenchmarkXxx、ExampleXxx表驱动用例名要能说明场景。推荐层面布尔变量用ok/found/enabled避免data、info、tmp、handle当公共名。四、错误处理领域层用 error绑定层收成 QueryResult强制条款领域层用error禁止 panic 当控制流。internal/app、internal/db禁止panic测试里的t.Fatal除外。只包装一次语义fmt.Errorf(connect mysql: %w, err)。能判定用errors.Is/errors.As禁止字符串匹配 errno。禁止_ err、err.Error()后丢类型、空if err ! nil {}。错误字符串小写开头、不以标点结尾Go 惯例。给 UI 的句子不要当error原文走 i18n 后放进QueryResult.Message。Wails 绑定边界返回connection.QueryResult。失败时Success: false 可展示Message不要把未包装的error丢给前端。失败时先logger.Error(err, ...)可带formatConnSummary再返回。摘要不得含密码、token、完整 DSN。手册给出了正反示例错误处理小节正确写法如下data, fields, err : a.runQuery(ctx, config, q) if err ! nil { logger.Error(err, DBQuery failed: %s, formatConnSummary(config)) return connection.QueryResult{ Success: false, Message: a.appText(db.backend.error.query_failed, map[string]any{detail: err.Error()}), } } return connection.QueryResult{Success: true, Data: data, Fields: fields}源码印证QueryResult的真实定义位于 internal/connection/types.go它确实是 Wails 绑定方法的统一响应结构type QueryResult struct { Success bool json:success Message string json:message Data interface{} json:data Fields []string json:fields,omitempty Messages []string json:messages,omitempty Partial bool json:partial,omitempty ExecutedCount int json:executedCount,omitempty FailedIndex int json:failedIndex,omitempty BoundaryMode string json:boundaryMode,omitempty CommitMode string json:commitMode,omitempty Warnings []string json:warnings,omitempty OutcomeUnknown bool json:outcomeUnknown,omitempty FailedObjectTypes []string json:failedObjectTypes,omitempty Retryable bool json:retryable,omitempty Truncated bool json:truncated,omitempty ScannedCount int json:scannedCount,omitempty DurationMs int64 json:durationMs,omitempty QueryID string json:queryId,omitempty CancellationState string json:cancellationState,omitempty TransactionID string json:transactionId,omitempty TransactionPending bool json:transactionPending,omitempty }这解释了手册为何要求给 UI 的句子走 i18n 后放进QueryResult.Message——前端Vue/React、MCP 与 Web RPC 都消费同一份 JSON 契约。脱敏摘要formatConnSummary在 internal/app/app.go 实现它对连接配置做归一化超时兜底 30 秒、库名空则显示(default)只输出可用于日志定位的摘要不含密码与完整 DSN。推荐条款同一错误不要既 log 又 wrap 三次绑定层 log 一次即可内部 helper 只返回error。五、Context取消必须穿透到底层强制条款context.Context必须是第一个参数变量名ctx禁止塞进结构体长期存放请求级 ctx 除外生命周期随请求结束。查询、元数据、HTTP、驱动 agent 必须把取消传到最底层QueryContext、http.Request、gRPC。手册点名参考BindMetadataContext/metadataContextFor。忽略 ctx 会导致取消失效、连接与 goroutine 泄漏。连接超时与查询超时分开建连 deadline ≠ 查询 deadline见newQueryExecutionContextWithParent。禁止context.Background()冒充用户请求只有进程级后台任务才用 Background且必须有停止条件。不要用context.WithValue传可选业务参数连接配置、loggerValue 仅限请求追踪等横切 ident。源码印证取消契约在 internal/db/database.go 的接口注释中写得很明确MCP 元数据请求通过BindMetadataContext把请求上下文绑定到隔离的 Database 实例驱动实现必须在底层调用中传递metadataContextFor返回的上下文如QueryContext/ HTTP request context。若驱动忽略该上下文取消将退化为等待查询自然结束连接与 goroutine 会残留至查询完成。连接/查询超时分离的实现入口newQueryExecutionContextWithParent位于 internal/app/query_execution_context.go它从父上下文派生独立 deadline把建连耗时与单次查询耗时隔离开避免一次慢连接耗尽整个查询窗口。六、接口与实现消费方定义、可选能力用可选接口强制条款接口由消费方定义小而精。本仓库公共数据源契约是db.Database特有能力用可选接口TableExistsChecker、ElasticsearchConsoleExecutor禁止把所有驱动方法塞进Database。用编译期断言锁定实现var _ db.Database (*MySQLDB)(nil)。接受接口、返回结构体。绑定层不要为了好 mock返回巨大 interface。不要为单实现去抽象第二个实现出现再抽接口。指针是否实现接口以方法集为准不要无意义地一律*T。推荐条款可选接口类型断言失败时走已有慢路径或明确错误不要静默当成功。源码印证db.Database接口定义在 internal/db/database.go包含Connect、Close、Ping、Query、Exec、GetDatabases、GetTables、GetCreateStatement、GetColumns、GetAllColumns、GetIndexes、GetForeignKeys、GetTriggers等元数据方法。而特有能力全部独立成可选接口同文件内可见ElasticsearchConsoleExecutordatabase.go执行已解析的 Elasticsearch REST 请求而不转成表格 SQL 结果TableExistsCheckerdatabase.go单表规范元数据身份点查不解析任意 SQL 标识符还有DatabaseForeignKeyProvider、TableCommentProvider、TableColumnsBatcher、ElasticsearchConsoleTransportHealth、ElasticsearchServerVersionProvider等database.go每个都只描述一个横切能力。编译期断言在驱动与测试中大量出现例如 internal/db/iris_impl.go 的var _ Database (*IrisDB)(nil)与var _ Database (*CacheDB)(nil)以及 internal/db/kingbase_impl.go 的var _ DatabaseForeignKeyProvider (*KingbaseDB)(nil)。测试侧同样用断言锁定 fake 实现见 internal/app/methods_db_metadata_context_test.go 的var _ db.Database (*contextAwareMetadataDB)(nil)等。七、结构体、零值与拷贝强制条款结构体字面量有多个字段时用 keyed fields。Mutex 不要拷贝。sync.Mutex/sync.WaitGroup放结构体里用指针传递或放在拷贝不到的位置。含sync.Mutex、sql.DB、连接句柄的类型禁止值拷贝方法用指针接收者。Slice / map 作为返回值时调用方视为只读或自行拷贝内部复用 buffer 必须写明禁止把共享 backing array 漏出后再改。不要用嵌入来继承行为。嵌入只为真正的 is-a 或样板转发且不嵌入会泄漏未导出互斥量的类型。推荐条款零值可用var mu sync.Mutex、var sb strings.Builder构造函数只在零值不安全时才需要。八、控制流与函数强制条款提前返回减少嵌套if err ! nil { return }优先于else。禁止无意义elseif 分支已 return 时不要 else。函数只做一件事超过 120 行必须拆绑定方法超过 80 行优先抽未导出 helper。避免裸参数copyRange(start, end, true /* inclusive */)应改成copyRange(Range{...})或具名常量。不要用命名返回值回避err处理仅在能明显提升文档性时使用并避免naked return与阴影err。推荐条款声明靠近使用if v, err : f(); err ! nil缩小作用域。九、并发每个 goroutine 必须有退出条件强制条款不 fire-and-forget。每个 goroutine 必须有退出条件ctx.Done()、WaitGroup、生命周期跟App/ 连接绑定。Channel 默认无缓冲有缓冲必须注释容量为什么是那个数。不要用 channel 当互斥锁共享状态用sync.Mutex。锁粒度小禁止在持锁时做网络 IO、跑用户 SQL、调前端事件。禁止在持锁时再调可能抢同一把锁的公开方法自死锁。time.After在循环里会泄漏 timer用time.NewTimer并Stop。竞态用go test -race能覆盖的路径必须可测共享 map 必须有锁或改为sync.Map仅适合读多写少的缓存。推荐条款启动 goroutine 的函数负责等待或登记到已有 supervisor连接池、keep-alive、sync job。这与仓库中internal/app/db_cache_ping_interval连接缓存 ping 周期 30 秒见 app.go以及internal/sync的同步任务生命周期管理是一致的模式。十、Slice、Map 与性能强制条款预先知道长度时make([]T, 0, n)/make(map[K]V, n)。不要append到可能共享的 slice 再当新所有权除非已copy或证明 cap 独占。比较切片用bytes.Equal/slices.Equal不要用reflect.DeepEqual当热路径。热路径避免无界拼接 SQL 字符串导致内存暴涨大结果集遵守现有截断字段Truncated、maxRemoteJSONResponseBytes。推荐条款不必微优化普通元数据路径先正确再对 benchmark 证明过的热点动手。源码印证截断约束是真实存在的硬编码maxRemoteJSONResponseBytes 32 2032MB见 internal/db/database.goTruncated字段则承载在QueryResult上types.go。手册与源码共同定义了大结果集不许无界膨胀的边界。十一、日志、敏感信息与 i18n强制条款只用internal/logger不要log.Printf/fmt.Println打运行日志。禁止输出密码、密钥、token、私钥、完整 DSN、Authorization 头。连接日志用formatConnSummary这类已脱敏摘要。SSH 进度事件不含敏感字段新事件照做。用户可见文案a.appText/localizer.T(key, params)键在shared/i18n绑定层不要写死中英文句子测试夹具除外。日志可以中英混合但必须无密钥、可检索方法名 结果 摘要。这解释了错误处理章节代码示例里formatConnSummary(config)的用途日志可检索但不能泄露连接秘密。i18n 键位体系位于 shared/i18n前端与后端共用同一份语言资源。十二、测试强制条款文件xxx_test.go与实现同包需测未导出行为时。表驱动t.Run(name, func(t *testing.T) { ... })。禁止单测打真实生产库、真实收费 API外部依赖用 fake / httptest / 接口 stub。断言失败用t.Fatal/t.Fatalf后续无效或t.Error还可继续不要panic。测试文件建议按场景拆分不要往已经数千行的*_test.go继续堆。抽出来的纯函数必须带单测。推荐条款用t.Helper()时间用 fake clock 或短 timeout并发测试加-race。源码印证仓库测试严格遵守这些约束methods_db_metadata_context_test.go里contextAwareMetadataDB与blockingConnectMetadataDB都是 fake 实现用于验证上下文取消与连接超时的真实行为var _ db.Database (*cacheConcurrencyDB)(nil)app_db_cache_concurrency_test.go锁定并发缓存测试用的伪驱动。外部依赖一律以 stub / httptest 替代测试从不触碰真实数据库或付费 API。十三、注释与导出文档强制条款所有导出类型、函数、常量必须有注释且以名字开头// Database 定义统一数据源访问接口。——这正是 database.go 的实际风格。注释写为什么不写把代码念一遍。复杂取消契约、JSON 兼容、平台差异必须写参考BindMetadataContext。不要注释掉大段死代码提交用 git。推荐条款包注释放doc.go或该包主文件顶部。database.go中TableColumnsBatcher的注释是写为什么的典范它解释了逐表读字段在大库上是预检的主要成本N 张表就是 N 次往返并写明缺席与空切片的语义差异让调用方能够区分确实是空表与驱动没找到它。十四、GoNavi 叠加条款Wails 绑定与驱动开发这是手册相对通用 Go 规范独有的部分直接服务于本项目架构。强制条款App导出方法只做四件事校验、只读/生产风险策略、调领域包、收成QueryResult或既有 DTO。禁止在绑定层写驱动 SQL、拼协议、做 UI 逻辑。不随意改导出方法名、参数、QueryResultJSON 字段。前端、MCP、Web RPC 共用契约。新驱动实现db.Database 需要的可选接口在工厂注册lite/full 构建走现有database_optional_factories_*.go不要破坏 lite 构建标签。SQL 走驱动实现审计、脱敏走internal/sqlaudit不得绕过。资源成对Connect/Close、forwarder、sql.Rows必须Closedefer用于清理。不要引入新的全局可变单例连接缓存放在App已有结构里注意锁与 ping 周期。源码印证lite/full 双构建是真实存在的机制internal/db/database_optional_factories_lite.go头部为//go:build !gonavi_full_drivers其中registerOptionalDatabaseFactories()通过newOptionalDriverAgentDatabase(...)注册了 mariadb、oceanbase、doris、starrocks、sphinx、sqlserver、sqlite、duckdb、dameng、kingbase、highgo、vastbase、opengauss、gaussdb、iris、mongodb、tdengine、iotdb、clickhouse、elasticsearch、trino 等可选驱动database_optional_factories_lite.go。同目录的optional_driver_build_lite.go同样带//go:build !gonavi_full_drivers标签。新增驱动时必须在工厂注册并遵守既有 lite 构建标签否则会破坏轻量构建不含可选驱动的构建契约。不随意改导出契约的约束同样有据可依QueryResult的 JSON 字段被前端frontend/wailsjs生成绑定、MCP 服务internal/mcpserver与 Web RPCinternal/webserver共同消费改名即破坏三端契约。十五、导入、格式与依赖强制条款gofmt/goimports后的格式才可提交。import 分组标准库 / 内部GoNavi-Wails/.../ 第三方。禁止不用的导入、未使用变量。新增依赖必须有明确理由不要为一点字符串功能拉重量库。不要手改frontend/wailsjs里由 Wails 生成的 Go 绑定 TS。源码印证internal/app/app.go 的 import 区严格呈现三组标准库context、errors、fmt、net、os……→ 内部GoNavi-Wails/...appdata、connection、db、importjob、logger……→ 第三方github.com/google/uuid、golang.org/x/sync/singleflight。依赖克制可见一斑uuid 用于查询 ID 等场景singleflight 用于连接缓存防击穿均为必要引入。十六、在 GoNavi 仓库中的落地检查清单将手册压缩成提交前的自检清单适合新增代码时逐条核对包名短小无下划线没抢导出类型的词新逻辑进了新文件≤400 行而非methods_db.go/methods_file.go/app.goGetter 没加Get错误变量errXxx、哨兵ErrXxx缩写大小写正确错误只 wrap 一次语义、用errors.Is/As、字符串小写开头无标点绑定层返回QueryResult{Success, Message}并先logger.ErrorformatConnSummaryctx 是第一参数且取消已传到QueryContext/HTTP/gRPC建连 deadline 与查询 deadline 分离没拿context.Background()冒充请求新驱动实现了db.Database 可选接口、有编译期断言、已在工厂注册且不破坏 lite 构建标签结构体含 Mutex/sql.DB用指针接收者没拷贝 Mutex每个 goroutine 有退出条件无缓冲 channel 默认、有缓冲必有容量注释没在持锁时做网络 IO循环里用time.NewTimer而非time.After预知长度就make预分配热路径不用reflect.DeepEqual大结果集尊重Truncated/maxRemoteJSONResponseBytes日志只走internal/logger绝无密码/token/完整 DSN用户文案走 i18n测试同包、表驱动、不打真实库、断言用t.Fatal/t.Error、并发加-race导出符号都有以名字开头的注释注释写 why 不写 whatgofmt/goimports已格式化import 三组分组正确没手改frontend/wailsjs对照 GO_STYLE.md 逐项落实即可保证新增代码与仓库数千个 Go 文件保持同一工程水准同时不破坏 Wails 前端、MCP 服务与 Web RPC 共用的绑定契约。赞分享数据库客户端桌面应用MCP 服务【免费下载链接】GoNaviHigh-performance multi-data-source database client — ~30MB, AI MCP ready, zero Electron bloat. | 高性能多数据源数据库客户端约 30MBAI 与 MCP 就绪告别 Electron 膨胀。项目地址https://gitcode.com/gh_mirrors/go/GoNavi点击查看免费下载相关推荐go-swagger 社区 FAQ 深度解读模型生成、服务器定制与 Spec 规范实战手册go swagger 社区 FAQ 深度解读模型生成、服务器定制与 Spec 规范实战手册 本指南以 go swagger 官方 FAQ docs/faq/代码生成开发工具后端API设计misode.github.io模组支持教程如何为Fabric和Forge模组创建生成器misode.github.io模组支持教程如何为Fabric和Forge模组创建生成器 misode.github.io是Minecraft数据生成工具的终OpenZeppelin Contracts 工程规范深度解析从测试策略到 Solidity 编码约定OpenZeppelin Contracts 工程规范深度解析从测试策略到 Solidity 编码约定 导读 在 WTF Solidity 仓库的 Found示例工程区块链教程上一篇OAuth 2.0 授权流程深度解析从 Authorization Code 到 Client Credentialssystem-design-101下一篇OpenUSD UsdProfiles 能力兼容性查询完全指南Capability DAG、ClaimsAPI 与 Profiles 实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考