www.zhblog.net

gofmt 格式化源码


如果你是个有点责任感的开发者,在新接触一门语言的时候,应该会问一个问题:「我该用什么格式写程序?」所以了,在 Go 里要用什么格式写程序?这个问题可以直接请gofmt来帮你解答。

使用 gofmt

使用gofmt最简单的方式之一,就是直接执行gofmt,这会接受你在标准输入(Standard input)键入的的代码,输入完成后按下 Ctrl + Z,gofmt就会告诉你怎么要用什么格式,例如,来个 Hello, World:

gofmt

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

gofmt

你也可以指定文件,格式化后的结果会输出至标准输出(Standard output),或者是一个目录,这会递归地将其中的 .go 文件读入并格式化后,输出至标准输出,也可以加上-w指定以格式化后的结果重写原有的 .go 文件。

有些格式在 Go 中是强制的,例如,大括号{}必须是右上左下的形式,因此,如果你将大括号置于同一侧,执行gofmt就会得到错误消息:

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,其中patternreplacement必须是合法的 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

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


展开阅读全文

评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 心情