golang linter 总是抱怨

Hai*_*Dog 5 static-analysis go golangci-lint

问:如何解决ireturnnolintlintlinter 之间的这种疯狂问题?

细节:

我有一个带有此签名的 Golang 函数

func NewClientCredentialsTokenSource(
    issuer string,
    clientId string,
    clientSecret string,
    scope []string,
) (oauth2.TokenSource, error) {
Run Code Online (Sandbox Code Playgroud)

当我运行 golangci-lint v1.43.0 时,它报告

golangci-lint run
oidc/token_utils.go:19:1: NewClientCredentialsTokenSource returns interface (golang.org/x/oauth2.TokenSource) (ireturn)
func NewClientCredentialsTokenSource(
Run Code Online (Sandbox Code Playgroud)

由于该函数只有两个返回参数,因此很容易推断出它是在抱怨,oauth2.TokenSource而不是在抱怨error

by 调用的下游函数NewClientCredentialsTokenSource返回一个实例,oauth2.TokenSource因此我没有要返回的具体类型。没办法,只能返回oauth2.TokenSource接口了。

所以我向函数添加了一个 lint 异常,如下所示:

//nolint:ireturn
func NewClientCredentialsTokenSource(
    issuer string,
    clientId string,
    clientSecret string,
    scope []string,
) (oauth2.TokenSource, error) {
Run Code Online (Sandbox Code Playgroud)

您可能认为这应该可以解决问题,但事实并非如此!现在报告了一个新的 lint 问题:

golangci-lint run
oidc/token_utils.go:19:1: directive `//nolint:ireturn` is unused for linter "ireturn" (nolintlint)
//nolint:ireturn
Run Code Online (Sandbox Code Playgroud)

所以现在我正在追我的尾巴。ireturn抱怨我正在返回一个接口。我为该函数添加了一个例外,只是为了nolintlint抱怨我有一个不适用的例外。

一个男人该做什么?

Hai*_*Dog 4

我尝试按照 Nico Huysamen 的建议添加允许规则,但这却带来了麻烦。最后我仍然想相信 linterireturn并且还不想禁用它。我认为解决此问题的最简洁方法是为两个 linter 添加例外,ireturn如下nolintlint所示:

//nolint:nolintlint,ireturn
func NewClientCredentialsTokenSource(
    issuer string,
    clientId string,
    clientSecret string,
    scope []string,
) (oauth2.TokenSource, error) {
Run Code Online (Sandbox Code Playgroud)

2022 年 5 月 25 日更新:

也许更好的解决方案如下所示。由于某种原因,ireturn异常必须进入函数签名内部。

func NewPasswordGrantTokenSource( //nolint:ireturn
    issuer string,
    clientId string,
    clientSecret string,
    username string,
    password string,
    scope []string,
) (oauth2.TokenSource, error) {
Run Code Online (Sandbox Code Playgroud)