對(duì)于一門編程語言來說噩凹,代碼格式化是最容易引起爭議的一個(gè)問題,不同的開發(fā)者可能會(huì)有不同的編碼風(fēng)格和習(xí)慣,但是如果所有開發(fā)者都能使用同一種格式來編寫代碼,開發(fā)者就可以將寶貴的時(shí)間專注在語言要解決的問題上翩活。
gofmt介紹
Golang的開發(fā)團(tuán)隊(duì)制定了統(tǒng)一的官方代碼風(fēng)格阱洪,并且推出了gofmt工具(gofmt或go fmt)來幫助開發(fā)者格式化他們的代碼到統(tǒng)一的風(fēng)格。gofmt是一個(gè)cli程序菠镇,會(huì)優(yōu)先讀取標(biāo)準(zhǔn)輸入冗荸,如果傳入了文件路徑的話,會(huì)格式化這個(gè)文件利耍,如果傳入一個(gè)目錄蚌本,會(huì)格式化目錄中所有.go文件,如果不傳參數(shù)隘梨,會(huì)格式化當(dāng)前目錄下的所有.go文件程癌。
gofmt默認(rèn)不對(duì)代碼進(jìn)行簡化,使用-s參數(shù)可以開啟簡化代碼功能轴猎,具體來說會(huì)進(jìn)行如下的轉(zhuǎn)換:
- 去除數(shù)組嵌莉、切片、Map初始化時(shí)不必要的類型聲明:
如下形式的切片表達(dá)式:
[]T{T{}, T{}}
將被簡化為:
[]T{{}, {}}
- 去除數(shù)組切片操作時(shí)不必要的索引指定
如下形式的切片表達(dá)式:
s[a:len(s)]
將被簡化為:
s[a:]
- 去除迭代時(shí)非必要的變量賦值
如下形式的迭代:
for x, _ = range v {...}
將被簡化為:
for x = range v {...}
如下形式的迭代:
for _ = range v {...}
將被簡化為:
for range v {...}
gofmt命令參數(shù)列表如下:
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命令還支持自定義的重寫規(guī)則,使用-r參數(shù)垮斯,按照pattern -> replacement的格式傳入規(guī)則郎仆。
有如下內(nèi)容的Golang程序,存儲(chǔ)在main.go文件中兜蠕。
package main
import "fmt"
func main() {
a := 1
b := 2
c := a + b
fmt.Println(c)
}
用以下規(guī)則來格式化上面的代碼扰肌。
gofmt -r "a + b -> b + a"
格式化的結(jié)果如下。
package main
import "fmt"
func main() {
a := 1
b := 2
c := b + a
fmt.Println(c)
}
*注意:Gofmt使用tab來表示縮進(jìn)熊杨,并且對(duì)行寬度無限制曙旭,如果手動(dòng)對(duì)代碼進(jìn)行了換行,gofmt也不會(huì)強(qiáng)制把代碼格式化回一行晶府。
go fmt和gofmt
gofmt是一個(gè)獨(dú)立的cli程序桂躏,而go中還有一個(gè)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命令本身只有兩個(gè)可選參數(shù)-n和-x剂习,-n僅打印出內(nèi)部要執(zhí)行的go fmt的命令,-x命令既打印出go fmt命令又執(zhí)行它较沪,如果需要更細(xì)化的配置鳞绕,需要直接執(zhí)行g(shù)ofmt命令。
go fmt在調(diào)用gofmt時(shí)添加了-l -w參數(shù)尸曼,相當(dāng)于執(zhí)行了gofmt -l -w
们何。
goland中配置gofmt
Goland是JetBrains公司推出的Go語言IDE,是一款功能強(qiáng)大控轿,使用便捷的產(chǎn)品冤竹。
在Goland中拂封,可以通過添加一個(gè)File Watcher來在文件發(fā)生變化的時(shí)候調(diào)用gofmt進(jìn)行代碼格式化,具體方法是贴见,點(diǎn)擊Preferences -> Tools -> File Watchers烘苹,點(diǎn)加號(hào)添加一個(gè)go fmt模版,Goland中預(yù)置的go fmt模版使用的是go fmt命令片部,將其替換為gofmt镣衡,然后在參數(shù)中增加-l -w -s參數(shù),啟用代碼簡化功能档悠。添加配置后廊鸥,保存源碼時(shí),goland就會(huì)執(zhí)行代碼格式化了辖所。
參考文章
https://golang.org/doc/effective_go.html
https://openhome.cc/Gossip/Go/gofmt.html
https://github.com/hyper0x/go_command_tutorial/blob/master/0.9.md