文件未使用 `-s` 进行 `gofmt` 编辑:为什么会发生这种情况以及如何解决?

File is not `gofmt`-ed with `-s`: why is this happening and how to resolve it?

每次我们在 our repository.

上打开或更新 Pull Request 时,我们都会使用 运行 通过 Github Actions 工作流的 linter(针对 Golang)

最近开始return以下error:

File is not `gofmt`-ed with `-s` (gofmt)

this other PR 中对文件 pkg/api/api/go 发生的事情之后。
(编辑:添加 link 以评估并最终重现错误)

证据:

我想了解这个错误的根源是什么,以及如何解决?

错误来源

文件格式不符合 Go 规则.

时,似乎会返回此错误

例如:如果您不小心使用了制表符缩进而不是空格。

编辑:blackgreen 的回答 给出了关于错误来源的更准确的细节


如何解决

您可以使用以下 Go 命令:

gofmt -s -w <path_to_file>.go

...然后提交代码。

请注意,在我的情况下:gofmt -w pkg/api/api.go 足以解决问题(没有 -s 标志,我觉得这很奇怪,因为错误特别要求 -s).

Source 1 + Source 2

gofmt 中的 -s 标志与格式无关。关于simplifying代码:

Try to simplify code (after applying the rewrite rule, if any).

您看到的警告来自 linter golangci-lint. Since you claim to have fixed the error by running gofmt -w, the presence of the hint "with -s" may be due to this bug: https://github.com/golangci/golangci-lint/issues/513

链接的问题已于 2019 年修复并与 v1.17.0 一起发布。您可能想检查您的管道是否使用旧版本。

假设您的文件 pkg/api/api.go 只是因为未格式化而触发了警告,gofmt -w 解决了这个问题,因为 -w 覆盖了文件:

If a file's formatting is different from gofmt's, overwrite it with gofmt's version.