在整个源代码树上执行 fmt

我有一个项目目前组织这样的东西:

~/code/go
/bin
/pkg
/src
/proj/main.go
/some_package/package.go
/some_other_package/some_other_package.go

现在,如果我想在我的整个项目中使用 go fmt工具,似乎唯一的方法就是对我的项目源代码树中的每个目录单独使用它:

go fmt proj
go fmt proj/package
go fmt proj/some_other_package

有什么方法可以告诉 fmt 命令在整个源代码树上运行吗?

51261 次浏览
find proj -type f -iregex '.*\.go' -exec go fmt '{}' +

Explanation

  • find proj: find everything in this directory...
    • -type f: ...that is a file
    • -iregex '.*\.go': ...and case-insensitively matches the regular expression .*\.go
  • ...and execute go fmt followed by as many matched files as the operating system can handle passing to an executable in one go.

You can use three dots (...) as a wildcard. So for example, the following command will format all github.com packages:

go fmt github.com/...

This wildcard also works with other go commands like go list, go get and so. There is no need to remember such an ugly find command.

If you use gofmt instead of go fmt, it's recursive. For example, following command

gofmt -s -w .

(notice the little dot at end) recursively formats, simplifies, and saves result into every file under current directory. I have a shell alias gf defined as gofmt -s -w . and find it quite handy.

Try gofmt -l . (list files whose formatting differs from gofmt's) first if you want :-)

Also, you can try to run command:

go fmt ./...

from your project directory.

The command gofmt ./... mentioned by some, does not work on Windows (at least on my Win7).

Instead of it, I used gofmt -d .\ which works recursively. I use the -d flag because I want to list the changes I need to make in order to pass the check.

NB: golint ./... does work on Windows, just gofmt ./... doesn't.

if you are using GoLand IDE, right click on project and you will find Go Tools. enter image description here