Go中无@Deprecated注解,弃用标识仅通过go.mod的// Deprecated:(模块级)或导出项正上方顶格单行// Deprecated:(函数/类型级)实现,二者机制不同且不可混用。

Go 里没有 @Deprecated 注解
Java 那套 @Deprecated 在 Go 里根本不存在,Go 不支持语法级的弃用标记。你写 //go:deprecated 或类似注解,go build 不会报错,但也不会被任何官方工具识别——go list、go doc、IDE hover 提示全都不认。
真正起作用的只有两种方式:一种是模块级弃用(写在 go.mod),另一种是函数/类型级弃用(靠符合规范的 Doc 注释)。两者机制不同、生效范围也不同,不能混用。
// Deprecated: 必须顶格、单行、紧贴导出标识符
要让 go doc 和 IDE(如 GoLand、VS Code)把某个函数标为“已废弃”,必须满足全部以下条件:
-
// Deprecated:必须顶格写,前面不能有空格或 tab - 必须是单行注释,不能换行,也不能拆成多行
- 冒号后必须跟一个空格,再写替代说明(例如
// Deprecated: use NewClient instead) - 必须紧贴在导出函数/类型声明正上方,中间不能有任何空行
- 函数名首字母必须大写(否则不会出现在文档中,也就谈不上标记弃用)
正确示例:
立即学习“go语言免费学习笔记(深入)”;
// Deprecated: use NewClient instead
func OldClient() *Client {
return &Client{}
}
错误写法包括:// deprecated: use NewClient(小写 d)、// Deprecated: use NewClient instead.(句号结尾反而干扰解析)、// Deprecated:\n// use NewClient instead(换行)、 // Deprecated: ...(缩进)。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
go.mod 中的 // Deprecated: 才影响 go list -m 输出
模块级弃用只在 go.mod 文件里生效,且格式极其严格:
- 必须写在
module github.com/xxx/yyy声明之后、require块之前 - 必须是单行、顶格、紧邻 module 行(中间不能有空行)
- 内容必须以
// Deprecated:开头,后面接迁移建议
例如:
module github.com/oldorg/legacy
// Deprecated: use github.com/neworg/v2 instead
require (
...
)
只有这样写,运行 go list -m -u all 时才会看到该模块名后带 (deprecated) 标记;go get github.com/oldorg/legacy 也会打印弃用提示。仅改 README 或 GitHub Archive 状态,go 工具链完全无视。
IDE 显示删除线 ≠ 编译器警告,别误判可靠性
GoLand 或 VS Code 显示某函数带删除线,只说明它识别到了符合规范的 // Deprecated: 注释——但这不等于编译时会告警,也不代表 go vet 或 staticcheck 会介入。
更关键的是:删除线颜色由 IDE 的 Identifier 字体色控制,不是单独可调的“弃用主题”。如果你把 Identifier 设成 #888,那即使没弃用的函数看起来也灰扑扑的;设太浅(比如 #ccc),删除线反而不明显。实际协作中,有人关掉删除线样式,就完全看不到弃用提示了。
所以真正可靠的弃用信号永远只有两个:go list -m -u all 输出里的 (deprecated),或调用时 go get 打印的明确提示。别依赖 IDE 渲染做判断。

















