我目前有一个类似的项目:
~/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命令在整个源代码树上运行?
答案 0 :(得分:82)
您可以使用三个点(...
)作为通配符。因此,例如,以下命令将格式化所有github.com包:
go fmt github.com/...
此通配符也适用于其他go命令,例如go list
,go get
等。没有必要记住这样丑陋的查找命令。
答案 1 :(得分:35)
如果您使用gofmt
而不是go fmt
,那么它是递归的。例如,按照命令
gofmt -s -w .
(注意结尾处的小点)递归地格式化,简化并将结果保存到当前目录下的每个文件中。我将shell别名gf
定义为gofmt -s -w .
,并且发现它非常方便。
如果您需要,请先尝试gofmt -l .
(列出格式与gofmt的不同的文件): - )
答案 2 :(得分:5)
find proj -type f -iregex '.*\.go' -exec go fmt '{}' +
find proj
:找到此目录中的所有内容...
-type f
:...这是一个文件-iregex '.*\.go'
:...并且不区分大小写匹配正则表达式.*\.go
go fmt
后跟多个匹配的文件,因为操作系统可以一次性处理传递给可执行文件。答案 3 :(得分:5)
此外,您可以尝试运行命令:
go fmt ./...
来自项目目录。
答案 4 :(得分:1)
某些人提到的命令gofmt ./...
在Windows上不起作用(至少在我的Win7上)。
我改用gofmt -d .\
来递归工作。我使用-d
标志是因为我想列出为了通过检查而需要进行的更改。
注意:golint ./...
在Windows上可以运行,只是gofmt ./...
在Windows上不能运行。
答案 5 :(得分:0)