Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 对整个源代码树进行fmt_Go - Fatal编程技术网

Go 对整个源代码树进行fmt

Go 对整个源代码树进行fmt,go,Go,我目前有一个项目组织如下: ~/code/go /bin /pkg /src /proj/main.go /some_package/package.go /some_other_package/some_other_package.go 有没有办法告诉fmt命令在整个源代码树上运行 find proj -type f -iregex '.*\.

我目前有一个项目组织如下:

~/code/go /bin /pkg /src /proj/main.go /some_package/package.go /some_other_package/some_other_package.go 有没有办法告诉fmt命令在整个源代码树上运行

find proj -type f -iregex '.*\.go' -exec go fmt '{}' +
解释
  • find proj
    :查找此目录中的所有内容。。。
    • -键入f
      :…这是一个文件
    • -iregex'.*\.go'
      :…大小写不敏感地匹配正则表达式
      .*\.go
  • …并执行
    go fmt
    ,然后执行操作系统能够一次性处理传递给可执行文件的尽可能多的匹配文件
您可以使用三个点(
)作为通配符。例如,以下命令将格式化所有github.com包:

go fmt github.com/...

此通配符还可与其他go命令一起使用,如
go list
go-get
等。没有必要记住这样一个难看的find命令。

如果使用
gofmt
而不是
go fmt
,那么它是递归的。例如,下面的命令

gofmt -s -w .
(注意末尾的小点)递归格式化、简化并将结果保存到当前目录下的每个文件中。我有一个shell别名
gf
定义为
gofmt-s-w.
,我发现它非常方便


如果需要,请首先尝试
gofmt-l.
(列出格式与gofmt不同的文件):

此外,您还可以尝试运行以下命令:

go fmt ./...

从项目目录中。

一些人提到的命令
gofmt./…
在Windows上不起作用(至少在我的Win7上是这样)

相反,我使用了递归工作的
gofmt-d.\
。我使用
-d
标志是因为我想列出为了通过检查需要进行的更改


注意:
golint./…
在Windows上可以工作,只是
gofmt./…
不能

如果您使用的是GoLand IDE,右键单击project,您将找到
Go Tools

很有趣。我的
go-fmt
文档说它是递归的,但我可以观察到它不是。很好的命令,很遗憾fmt工具不能自动完成这项工作。不过我做了一些调整:
findsrc
而不是
findproj
$GOROOT
运行它,以及
\而不是
+
,因为fmt工具在给定位于不同目录中的文件时不起作用。这是一个有用的命令,但我想做一些类似于
git status | egrep'\.go$'
然后用你的命令我怎么做?@Cristian:你可能需要用
awk
cut
或其他东西来处理文件名列表;但是,完成后,您应该能够使用
xargs
,例如
…|xargs go fmt
@Chris,使用
..
作为通配符的解释,我想知道为什么它是这样做的,而不是仅仅使用标准的通配符模式,如:
github.com/*
或像
github.com/***。go
gofmt-l-s-w。
产生类似于
go fmt
(保存文件并打印已修改的文件)。如果没有
-l
标志,则不会打印文件名。
git ls files | grep.go$”| xargs gofmt-l-s-w
仅对签入到您的repo的源文件执行此操作。这是否仅影响go文件或目录中的所有文件?如果
是符号链接,则不起作用。我发现可以使用符号链接。
go fmt ./...