Golang现代命名返回值检查器如何使用?

Golang现代命名返回值检查器如何使用? 什么是与 Go 1.24.1 兼容的命名返回 linter?

无论是 golangci-lint(nakedret、nonamedreturn)、lint-naked-returns,还是 returnstyles,都没有更新它们的 x 依赖项以应对破坏性的编译变更。

顺便提一句,Go 应该削弱其向后兼容性保证,或者将 x 库合并到标准库中,以确保未来的兼容性。

3 回复

我之所以这么问,是因为这些 linter 工具在每次 Go 新版本发布后都会变得无法使用。那些 x 依赖项引入了破坏性变更,而 linter 的维护者在跟进这些变更方面行动迟缓。

更多关于Golang现代命名返回值检查器如何使用?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


mcandre:

什么是与 Go 1.24.1 兼容的命名返回 linter?

无论是 golangci-lint(nakedret, nonamedreturn)、lint-naked-returns 还是 returnstyles,都没有更新它们的 x 依赖项以应对破坏性的编译变更。

顺便提一下,Go 应该削弱其向后兼容性保证,或者将 x 库合并到标准库中,以便未来验证。

截至 2025 年 4 月下旬,由于像 golangci-lintreturnstyles 这类流行选项中的 x 依赖项已过时,很可能没有现成的、与 Go 1.24.1 兼容的命名返回 linter。您最好的办法是在这些 linter 的 GitHub 仓库上关注更新,或者如果并非立即需要严格的 1.24.1 兼容性,可以暂时使用旧版本的 Go。构建自定义 linter 是一个更复杂的替代方案。关于 Go 的向后兼容性和 x 库的更广泛问题,是 Go 生态系统中一个已知的权衡。

对于Go 1.24.1,你可以使用revive工具中的named-return规则来检查命名返回值的使用。revive是一个活跃维护的linter,它不依赖golang.org/x/tools的易变内部API,因此能更好地兼容新版本Go。

安装:

go install github.com/mgechev/revive@latest

配置.revive.toml

[rule.named-return]
  arguments = ["error"]

示例代码检查:

// 触发警告的代码
func GetUser(id int) (user *User, err error) {
    if id <= 0 {
        return nil, errors.New("invalid id") // 警告:应使用命名返回值
    }
    return &User{ID: id}, nil
}

// 推荐的写法
func GetUser(id int) (*User, error) {
    if id <= 0 {
        return nil, errors.New("invalid id")
    }
    return &User{ID: id}, nil
}

运行检查:

revive -config .revive.toml ./...

revivenamed-return规则可以配置为只检查特定类型的返回值(如error),避免过度严格。它通过静态分析AST实现,不依赖易变的x/tools内部API,因此在Go 1.24.1上能稳定工作。

回到顶部