使用gofmt格式化代碼

對(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/cmd/gofmt/

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

點(diǎn)擊關(guān)注知乎專欄Golang私房菜

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惰说,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缘回,更是在濱河造成了極大的恐慌吆视,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酥宴,死亡現(xiàn)場離奇詭異啦吧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拙寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門授滓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肆糕,你說我怎么就攤上這事般堆。” “怎么了诚啃?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵淮摔,是天一觀的道長。 經(jīng)常有香客問我始赎,道長噩咪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任极阅,我火速辦了婚禮胃碾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筋搏。我一直安慰自己仆百,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布奔脐。 她就那樣靜靜地躺著俄周,像睡著了一般吁讨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峦朗,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天建丧,我揣著相機(jī)與錄音,去河邊找鬼波势。 笑死翎朱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尺铣。 我是一名探鬼主播拴曲,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凛忿!你這毒婦竟也來了澈灼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤店溢,失蹤者是張志新(化名)和其女友劉穎叁熔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體床牧,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荣回,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叠赦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹马。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡革砸,死狀恐怖除秀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情算利,我是刑警寧澤册踩,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站效拭,受9級(jí)特大地震影響暂吉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缎患,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一慕的、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挤渔,春花似錦肮街、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沛硅。三九已至,卻和暖如春绕辖,著一層夾襖步出監(jiān)牢的瞬間摇肌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工仪际, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留围小,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓弟头,卻偏偏與公主長得像吩抓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赴恨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • go build 這個(gè)命令主要用于編譯代碼疹娶。在包的編譯過程中,若有必要伦连,會(huì)同時(shí)編譯與之相關(guān)聯(lián)的包雨饺。 如果是普通包,...
    今早上閱讀 626評(píng)論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,107評(píng)論 25 707
  • 1. 分布式系統(tǒng)核心問題 參考書籍:《區(qū)塊鏈原理惑淳、設(shè)計(jì)與應(yīng)用》 一致性問題例子:兩個(gè)不同的電影院買同一種電影票额港,如...
    molscar閱讀 910評(píng)論 0 0
  • 引言 Go 語言這兩年在語言排行榜上的上升勢頭非常猛,Go 語言雖然是靜態(tài)編譯型語言歧焦,但是它卻擁有腳本化的語法移斩,支...
    一縷殤流化隱半邊冰霜閱讀 33,487評(píng)論 11 90
  • js浮點(diǎn)精度問題,著急解決的看下面一行就夠了: JavaScript 只有一種數(shù)字類型 Number向瓷,而且在Jav...
    cca1000閱讀 4,453評(píng)論 0 3