golang linter 总是抱怨

golang linter always complains

问:如何解决 ireturnnolintlint linter 之间的疯狂问题?

详情:

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

func NewClientCredentialsTokenSource(
    issuer string,
    clientId string,
    clientSecret string,
    scope []string,
) (oauth2.TokenSource, error) {

当我 运行 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(

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

NewClientCredentialsTokenSource 调用的下游函数 return 是 oauth2.TokenSource 的一个实例,所以我没有 return 的具体类型。我别无选择,只能 return oauth2.TokenSource 界面。

所以我像这样向函数添加了一个 lint 异常:

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

您认为这应该可以解决问题,但不是!现在报告了一个新的 lint 问题:

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

所以现在我在追我的尾巴。 ireturn 抱怨我正在 return 界面。我为该函数添加了一个例外,结果 nolintlint 抱怨我有一个不适用的例外。

男人要做什么?

您可以将接口添加到 ireturn 的允许接口列表中。

ireturn --allow="golang.org/x/oauth2.TokenSource"

或通过 .golangci.yml

中的 linter-settings 部分
linters-settings:
  ireturn:
    allow:
      - golang.org/x/oauth2.TokenSource

我尝试按照 Nico Huysamen 的建议添加允许规则,但这打开了一堆蠕虫。最后我还是想相信 ireturn linter 并且还不想禁用它。我认为解决此问题的最简洁方法是为两个 linter 添加一个例外,ireturnnolintlint,如下所示:

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

2022 年 5 月 25 日更新:

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

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