gofmt 格式化程式碼

劍塵發表於2019-06-11

對於一門程式語言來說,程式碼格式化是最容易引起爭議的一個問題,不同的開發者可能會有不同的編碼風格和習慣,但是如果所有開發者都能使用同一種格式來編寫程式碼,開發者就可以將寶貴的時間專注在語言要解決的問題上。

Golang的開發團隊制定了統一的官方程式碼風格,並且推出了gofmt工具(gofmt或go fmt)來幫助開發者格式化他們的程式碼到統一的風格。gofmt是一個cli程式,會優先讀取標準輸入,如果傳入了檔案路徑的話,會格式化這個檔案,如果傳入一個目錄,會格式化目錄中所有.go檔案,如果不傳引數,會格式化當前目錄下的所有.go檔案。

gofmt預設不對程式碼進行簡化,使用-s引數可以開啟簡化程式碼功能,具體來說會進行如下的轉換:

  • 去除陣列、切片、Map初始化時不必要的型別宣告:
如下形式的切片表示式:
    []T{T{}, T{}}
將被簡化為:
    []T{{}, {}}
  • 去除陣列切片操作時不必要的索引指定
如下形式的切片表示式:
    s[a:len(s)]
將被簡化為:
    s[a:]
  • 去除迭代時非必要的變數賦值
如下形式的迭代:
    for x, _ = range v {...}
將被簡化為:
    for x = range v {...}
如下形式的迭代:
    for _ = range v {...}
將被簡化為:
    for range v {...}

gofmt命令引數列表如下:

usage: gofmt [flags] [path ...]
  -cpuprofile string
        write cpu profile to this file
  -d    display diffs instead of rewriting files
  -e    report all errors (not just the first 10 on different lines)
  -l    list files whose formatting differs from gofmt's
  -r string
        rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')
  -s    simplify code
  -w    write result to (source) file instead of stdout

可以看到,gofmt命令還支援自定義的重寫規則,使用-r引數,按照pattern -> replacement的格式傳入規則。

有如下內容的Golang程式,儲存在main.go檔案中。

package main

import "fmt"

func main() {
   a := 1
   b := 2
   c := a + b
   fmt.Println(c)
}

用以下規則來格式化上面的程式碼。

gofmt -r "a + b -> b + a"

格式化的結果如下。

package main

import "fmt"

func main() {
   a := 1
   b := 2
   c := b + a
   fmt.Println(c)
}

*注意:Gofmt使用tab來表示縮排,並且對行寬度無限制,如果手動對程式碼進行了換行,gofmt也不會強制把程式碼格式化回一行。

gofmt是一個獨立的cli程式,而go中還有一個go fmt命令,go fmt命令是gofmt的簡單封裝。

usage: go fmt [-n] [-x] [packages]

Fmt runs the command 'gofmt -l -w' on the packages named
by the import paths. It prints the names of the files that are modified.
For more about gofmt, see 'go doc cmd/gofmt'.
For more about specifying packages, see 'go help packages'.
The -n flag prints commands that would be executed.
The -x flag prints commands as they are executed.
To run gofmt with specific options, run gofmt itself.

See also: go fix, go vet.

go fmt 命令本身只有兩個可選引數-n和-x,-n僅列印出內部要執行的go fmt的命令,-x命令既列印出go fmt命令又執行它,如果需要更細化的配置,需要直接執行gofmt命令。

go fmt在呼叫gofmt時新增了-l -w引數,相當於執行了gofmt -l -w

Goland 是 JetBrains 公司推出的 Go 語言 IDE,是一款功能強大,使用便捷的產品。

在 Goland 中,可以通過新增一個 File Watcher 來在檔案發生變化的時候呼叫 gofmt 進行程式碼格式化,具體方法是,點選Preferences -> Tools -> File Watchers,點加號新增一個go fmt模版,Goland 中預置的 go fmt 模版使用的是 go fmt 命令,將其替換為 gofmt,然後在引數中增加 -l -w -s 引數,啟用程式碼簡化功能。新增配置後,儲存原始碼時,goland 就會執行程式碼格式化了。

gofmt 格式化程式碼

作者:simpleapples\
連結:https://www.jianshu.com/p/104b33439ac2\
來源:簡書\

相關文章