Go 開發(fā)團(tuán)隊(duì)不想要 Go 語言像許多其它語言那樣總是在為代碼風(fēng)格而引發(fā)無休止的爭(zhēng)論,浪費(fèi)大量寶貴的開發(fā)時(shí)間,因此他們制作了一個(gè)工具:go fmt(gofmt)。這個(gè)工具可以將你的源代碼格式化成符合官方統(tǒng)一標(biāo)準(zhǔn)的風(fēng)格,屬于語法風(fēng)格層面上的小型重構(gòu)。遵循統(tǒng)一的代碼風(fēng)格是 Go 開發(fā)中無可撼動(dòng)的鐵律,因此你必須在編譯或提交版本管理系統(tǒng)之前使用 gofmt 來格式化你的代碼。
盡管這種做法也存在一些爭(zhēng)論,但使用 gofmt 后你不再需要自成一套代碼風(fēng)格而是和所有人使用相同的規(guī)則。這不僅增強(qiáng)了代碼的可讀性,而且在接手外部 Go 項(xiàng)目時(shí),可以更快地了解其代碼的含義。此外,大多數(shù)開發(fā)工具也都內(nèi)置了這一功能。
Go 對(duì)于代碼的縮進(jìn)層級(jí)方面使用 tab 還是空格并沒有強(qiáng)制規(guī)定,一個(gè) tab 可以代表 4 個(gè)或 8 個(gè)空格。在實(shí)際開發(fā)中,1 個(gè) tab 應(yīng)該代表 4 個(gè)空格,而在本身的例子當(dāng)中,每個(gè) tab 代表 8 個(gè)空格。至于開發(fā)工具方面,一般都是直接使用 tab 而不替換成空格。
在命令行輸入 gofmt –w program.go 會(huì)格式化該源文件的代碼然后將格式化后的代碼覆蓋原始內(nèi)容(如果不加參數(shù) -w 則只會(huì)打印格式化后的結(jié)果而不重寫文件);gofmt -w *.go 會(huì)格式化并重寫所有 Go 源文件;gofmt map1 會(huì)格式化并重寫 map1 目錄及其子目錄下的所有 Go 源文件。
gofmt 也可以通過在參數(shù) -r 后面加入用雙引號(hào)括起來的替換規(guī)則實(shí)現(xiàn)代碼的簡(jiǎn)單重構(gòu),規(guī)則的格式:<原始內(nèi)容> -> <替換內(nèi)容>。
實(shí)例:
gofmt -r '(a) -> a' –w *.go
上面的代碼會(huì)將源文件中沒有意義的括號(hào)去掉。
gofmt -r 'a[n:len(a)] -> a[n:]' –w *.go
上面的代碼會(huì)將源文件中多余的 len(a) 去掉。( 譯者注:了解切片(slice)之后就明白這為什么是多余的了 )
gofmt –r 'A.Func1(a,b) -> A.Func2(b,a)' –w *.go
上面的代碼會(huì)將源文件中符合條件的函數(shù)的參數(shù)調(diào)換位置。
如果想要了解有關(guān) gofmt 的更多信息,請(qǐng)?jiān)L問該頁面:http://golang.org/cmd/gofmt/。