如果你是个有点责任感的开发者,在新接触一门语言的时候,应该会问一个问题:「我该用什么格式写程序?」所以了,在 Go 里要用什么格式写程序?这个问题可以直接请gofmt
来帮你解答。
使用 gofmt
使用gofmt
最简单的方式之一,就是直接执行gofmt
,这会接受你在标准输入(Standard input)键入的的代码,输入完成后按下 Ctrl + Z,gofmt
就会告诉你怎么要用什么格式,例如,来个 Hello, World:

在上头的例子中,我故意制作了一些其他的格式惯例,而从输出中可以看到gofmt
建议的格式会是什么样子,例如,Go 建议的格式是使用 Tab 缩排,你键入的代码不用是完整的程序,也可以只是个语句,例如:

你也可以指定文件,格式化后的结果会输出至标准输出(Standard output),或者是一个目录,这会递归地将其中的 .go 文件读入并格式化后,输出至标准输出,也可以加上-w
指定以格式化后的结果重写原有的 .go 文件。
有些格式在 Go 中是强制的,例如,大括号{}
必须是右上左下的形式,因此,如果你将大括号置于同一侧,执行gofmt
就会得到错误消息:

gofmt 简单重构
gofmt
也可以使用-r
指定规则来实现简单的重构,例如在〈Command gofmt〉文件说明中,有个gofmt -r '(a) -> a' -l *.go
可以列出 .go 文件中有多余括号的文件名称(透过-l
实参来列出名称),要直接移除 .go 文件中多余的括号并重写原有的 .go 文件,可以使用gofmt -r '(a) -> a' -w *.go
。
-r
接受的规则是pattern -> replacement
,其中pattern
与replacement
必须是合法的 Go 语法,而单一、小写的字符会被作为万用字符(Wildcard),因此,如果有个源码内容是:
package goexample
func Hello(who string) {
var helloWho = ("Hello, ") + (who)
}
执行过后,会产生以下的结果:
package goexample
func Hello(who string) {
var helloWho = "Hello, " + who
}
再来看个无聊的例子,如果你的代码是:
package goexample
func Hello(who string) {
var helloWho = who + "Hello, "
}
若你想要gofmt
帮你改成:
package goexample
func Hello(who string) {
var helloWho = "Hello, " + who
}
你可以执行gofmt -r 'a + "Hello, " -> "Hello, " + a' -w *.go
,甚至gofmt -r 'a + b -> b + a' -w
来达到这个目的。
gofmt
还有个-s
实参,可以尝试为你简化源码,你可以看看〈Command gofmt〉文件中的说明,了解它会做哪些简化,文件中也谈到,简化后的 Go 源码,可能会与旧版的 Go 不兼容。
至于方才提及的goimports
,也可以透过go get golang.org/x/tools/cmd/goimports
来安装,例如:
go fmt
go
本身也可以附带fmt
,也就是使用go fmt
的方式来进行代码的格式化,go fmt
内部使用gofmt
,可以使用-n
来显示要被使用或已被使用的指令:

可以看到,go fmt
包装了gofmt -l -w
指令,简化了常用的指令输入,你只要指定包就可以了。