goland 默认启用 gounusedconst 检查但仅高亮不自动删除,需确认其在 settings → editor → inspections → go 中已启用并设为 warning 及以上;作用域默认限于当前文件,全项目扫描需手动触发 inspect code;该检查无法识别注释、go:generate 或文档契约中的使用,需配合全局搜索及人工判断。

GoLand 默认能检测未使用常量,但需确认检查已启用
GoLand 的 GoUnusedConst 检查默认开启,但它只在编辑器中高亮、不自动删除。如果你没看到常量被标灰或波浪线,大概率是该检查被禁用了,或者作用域没覆盖到目标文件。
验证方式:把光标停在一个明显未用的常量上(比如 const debugMode = false 且全项目没引用),看有没有灯泡提示或灰色标记。没有?说明检查没生效。
- 打开
Settings(Ctrl+Alt+S),进入Editor → Inspections → Go → Declaration redundancy - 确认
Unused constant(ID:GoUnusedConst)已勾选,且 Severity 设为WARNING或更高 - 注意作用域:默认只扫描“当前文件”或“修改过的文件”,如需全项目扫描,需手动触发“Inspect Code”(右键项目根目录 →
Inspect Code…)
为什么有些常量不报“unused”,但其实也没人用
GoLand 的 GoUnusedConst 基于符号引用分析,它认为“被字符串字面量拼接、被反射、被 _ = constName 引用”也算“已使用”。这类情况不会触发警告,但实际仍属冗余。
-
const version = "1.2.0"被fmt.Sprintf("v%s", version)使用 → 正常识别为已用 -
const logTag = "api"出现在log.Printf("[%s] req", logTag)→ 已用 -
const _ = "legacy_mode"(空标识符赋值)→ GoLand 认为“已引用”,不报 unused -
const errCode = 404仅出现在注释里:// default errCode is 404→ 不报,但确实无用
这类漏检必须靠全局搜索辅助验证。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
配合全局搜索快速交叉验证常量是否真没人用
单靠 IDE 检查不够可靠,最稳妥的方式是:先让 GoLand 标出疑似项,再用全局搜索确认是否真无引用。
- 按
Shift两次,输入常量名(如maxRetries),选择Symbol搜索类型 → 查看所有定义和引用位置 - 若搜索结果只有定义行(即
const maxRetries = 3那一行),且没有其他文件/行引用它 → 可安全删除 - 注意排除误匹配:搜索时勾选
Match whole word only和Case sensitive,避免匹配到变量名或注释中的子串 - 对小写字母开头的常量(如
defaultTimeout),还要确认是否被go:generate或外部工具读取(这类通常有注释说明)
批量清理建议用 golangci-lint + unused linter
GoLand 的单文件检查适合日常开发,但项目级批量清理常量,golangci-lint 更准、更可控,尤其对跨包或构建标签隔离的常量。
- 安装:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest - 运行:
golangci-lint run --enable=unused ./...(unusedlinter 比deadcode更专注常量/变量) - 输出示例:
util.go:5:7: var debugLog is unused (unused),定位精确到行 - 注意:
unused默认不检查导出常量(首字母大写),如需检查,加参数--disable-all --enable=unused --unused-check-exported
真正难判断的不是“有没有引用”,而是“这个常量是否承担了文档或配置契约作用”——比如 const DefaultPort = 8080 即使没被代码调用,删掉也可能破坏 API 文档或部署脚本里的硬编码依赖。这种得人工过一遍上下文,工具帮不上忙。










