Golang使用gofumpt進行代碼格式化
我們從一開始寫 Go 代碼和應(yīng)用,就會被各種官方和民間教程,甚至 IDE 教導(dǎo)我們必須配一個 gofmt 工具。他能夠格式化 Go 程序的代碼。會使用制表符表示縮進,空白表示對齊。
這解決了程序員屆的老大難問題之一,代碼格式上的規(guī)范問題。有效的提高了 Go 代碼的閱讀的友好度和減少了同事間的 ****。非常值得認可。
但有時候,還是會看到一些糟心的代碼,總會覺得 gofmt,還是格式化的不夠。
今天給大家分享我發(fā)現(xiàn)的一個更狠的工具:gofumpt,例子主要基于官方文檔。
更強的格式化:gofumpt
Gofumpt 會執(zhí)行比 gofmt 更嚴格的 Go 格式規(guī)范。同時確保向后兼容。
該工具是 Go 1.21 的 gofmt 分支,需要 Go 1.20 或更高版本。它可以直接替代現(xiàn)有的 Go 代碼格式化,也就是在 gofumpt 之后運行 gofmt 不會產(chǎn)生任何新的變化。
安裝命令:
$ go install mvdan.cc/gofumpt@latest
執(zhí)行命令:
$ gofumpt -l -w . main.go
再查看對應(yīng)被格式化的文件就已經(jīng)生效了。
以下是一些更具體的 gofmt 和 gofumpt 的區(qū)別例子。能夠很好的幫助大家識別其中的差異。
賦值運算符后無空行
原本由 gofmt 格式化后:
func foo() string {
foo :=
"腦子進煎魚了!"
return foo
}
改為 gofumpt 格式化后:
func foo() string {
foo := "腦子進煎魚了!"
return foo
}
函數(shù)體周圍無空行
原本由 gofmt 格式化后:
func foo() {
println("煎魚進腦子了!")
}
改為 gofumpt 格式化后:
func foo() {
println("煎魚進腦子了!")
}
函數(shù)應(yīng)分隔 ) { ,縮進有助于提高可讀性
原本由 gofmt 格式化后:
func foo(s string,
i int) {
println("煎魚?。?!")
}
// 使用空行會稍微好一些,但仍然不夠好
func bar(s string,
i int) {
println("煎魚?。?!")
}
改為 gofumpt 格式化后:
func foo(s string,
i int,
) {
println("煎魚!??!")
}
func bar(s string,
i int,
) {
println("煎魚?。。?)
}
代碼塊中的單獨語句(或注釋)周圍沒有空行
原本由 gofmt 格式化后:
if err != nil {
return err
}
改為 gofumpt 格式化后:
if err != nil {
return err
}
簡單錯誤檢查前無空行
原本由 gofmt 格式化后:
foo, err := processFoo()
if err != nil {
return err
}
改為 gofumpt 格式化后:
foo, err := processFoo()
if err != nil {
return err
}
復(fù)合字面量應(yīng)統(tǒng)一使用換行符
原本由 gofmt 格式化后:
var ints = []int{1, 2,
3, 4}
var matrix = [][]int{
{1},
{2}, {
3,
},
}
改為 gofumpt 格式化后:
var ints = []int{
1, 2,
3, 4,
}
var matrix = [][]int{
{1},
{2},
{
3,
},
}
空字段列表應(yīng)使用單行
原本由 gofmt 格式化后:
var V interface {
} = 3
type T struct {
}
func F(
)
改為 gofumpt 格式化后:
var V interface{} = 3
type T struct{}
func F()
標準庫導(dǎo)入必須在頂部單獨分組
原本由 gofmt 格式化后:
import ( "foo.com/bar" "io" "io/ioutil" )
改為 gofumpt 格式化后:
import ( "io" "io/ioutil" "foo.com/bar" )
短 case 子句應(yīng)占一行
原本由 gofmt 格式化后:
switch c {
case 'a', 'b',
'c', 'd':
}
改為 gofumpt 格式化后:
switch c {
case 'a', 'b', 'c', 'd':
}
多行頂層聲明必須用空行隔開
原本由 gofmt 格式化后:
func foo() {
println("煎魚!")
}
func bar() {
println("煎魚!")
}
改為 gofumpt 格式化后:
func foo() {
println("煎魚!")
}
func bar() {
println("煎魚!")
}
單個 var 聲明不應(yīng)使用括號分組
原本由 gofmt 格式化后:
var ( foo = "煎魚!" )
改為 gofumpt 格式化后:
var foo = "煎魚!"
連續(xù)的頂層聲明應(yīng)歸為一組
原本由 gofmt 格式化后:
var nicer = "x" var with = "y" var alignment = "z"
改為 gofumpt 格式化后:
var ( nicer = "x" with = "y" alignment = "z" )
簡單的 var 聲明語句應(yīng)使用短賦值
原本由 gofmt 格式化后:
var s = "煎魚進腦子了"
改為 gofumpt 格式化后:
s := "煎魚進腦子了"
默認啟用 -s 代碼簡化標記。
非 Go 指令的注釋應(yīng)以空格開頭
原本由 gofmt 格式化后:
//go:noinline
//Foo is awesome.
func Foo() {}
改為 gofumpt 格式化后:
//go:noinline
// Foo is awesome.
func Foo() {}
VSCode 配置
可以直接在 IDE 中進行配置。例如 VSCode,可以配置對應(yīng)的 settings.json 為如下:
{
"go.useLanguageServer": true,
"gopls": {
"formatting.gofumpt": true,
},
}
就可以直接在 Go 應(yīng)用中用起來了。
總結(jié)
之前我有一個朋友,接手了一個老項目。那位同學(xué),幾乎沒有什么代碼規(guī)范的風(fēng)格。全靠 gofmt 來幫他格式化。
但你們也看到,gofmt 只做了最基本的。這種時候如果有更嚴格的 Go 代碼格式化工具 gofumpt 是非常不錯的。(也需要引導(dǎo)這位同學(xué),但容易撕逼)
像是前面提到的 “多行頂層聲明必須用空行隔開” 是非常有價值的。我是真的見過一大坨不加空行都擠一起的??雌饋矸浅ky受。
到此這篇關(guān)于Golang使用gofumpt進行代碼格式化的文章就介紹到這了,更多相關(guān)Go gofumpt格式化代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang中為什么Response.Body需要被關(guān)閉詳解
這篇文章主要給大家介紹了關(guān)于golang中為什么Response.Body需要被關(guān)閉的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
golang如何部署到服務(wù)器及應(yīng)注意問題解析
這篇文章主要為大家介紹了golang如何部署到服務(wù)器及應(yīng)注意問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Golang中println和fmt.Println區(qū)別解析
Golang 中打印數(shù)據(jù)通常使用 fmt.Println() 方法,也可以使用內(nèi)置的 println() 方法。這兩個方法大家可能都使用過,它們的區(qū)別是什么呢?本文給大家詳細講解,感興趣的朋友跟隨小編一起看看吧2023-03-03

