Go 语言代码格式化工具 gofmt vs goimports

本页内容

在格式化 Go 代码的时候,经常会用到 gofmtgoimports 两个工具,不过他们之间到底有何区别呢?

In addition to fixing imports, goimports also formats your code in the same style as gofmt so it can be used as a replacement for your editor’s gofmt-on-save hook.

根据 goimports 文档的一段说明,goimports 除了修正 import 代码块外,和 gofmt 没其他区别。至于 import 代码块修正,举个栗子来说明下。

例子

 1package main
 2
 3import "stringsx"
 4
 5import "fmt"
 6
 7import "os"
 8
 9func Title(s string)  {
10    fmt.Println(strings.Title(s))
11}
12
13func main() {
14    Title("hello world")
15}

这里我特意将每个 import 顺序乱序,并相隔一行,其中 stringsx 是错误的包名,os 是没有使用到的包。

我们的期望应该是可以将 import 的包进行排序,去掉未使用的包,并且可以修正错误的包名。

gofmt

首先看下 gofmt 的格式化结果:

 1package main
 2
 3import "stringsx"
 4
 5import "fmt"
 6
 7import "os"
 8
 9func Title(s string) {
10        fmt.Println(strings.Title(s))
11}
12
13func main() {
14        Title("hello world")
15}

goimports

安装:go get golang.org/x/tools/cmd/goimports

接着对比 goimports 结果:

 1package main
 2
 3import (
 4        "fmt"
 5        "strings"
 6)
 7
 8func Title(s string) {
 9        fmt.Println(strings.Title(s))
10}
11
12func main() {
13        Title("hello world")
14}

结论

相对 gofmtgoimports 可以对 import 的包进行排序去除未使用的包,并修正错误的包名。简而言之,goimportsgofmt 更好用,对于强迫症必不可缺。

题外话

goimports 排序后,内置包和非内置包会有一空行相隔:

1import (
2    "errors"
3    ...
4
5    "github.com/foo/bar"
6    ...
7)