Golang使用gofumpt進(jìn)行代碼格式化
我們從一開始寫 Go 代碼和應(yīng)用,就會被各種官方和民間教程,甚至 IDE 教導(dǎo)我們必須配一個 gofmt 工具。他能夠格式化 Go 程序的代碼。會使用制表符表示縮進(jìn),空白表示對齊。
這解決了程序員屆的老大難問題之一,代碼格式上的規(guī)范問題。有效的提高了 Go 代碼的閱讀的友好度和減少了同事間的 ****。非常值得認(rèn)可。
但有時候,還是會看到一些糟心的代碼,總會覺得 gofmt,還是格式化的不夠。
今天給大家分享我發(fā)現(xiàn)的一個更狠的工具:gofumpt,例子主要基于官方文檔。
更強(qiáng)的格式化:gofumpt
Gofumpt 會執(zhí)行比 gofmt 更嚴(yán)格的 Go 格式規(guī)范。同時確保向后兼容。
該工具是 Go 1.21 的 gofmt 分支,需要 Go 1.20 或更高版本。它可以直接替代現(xiàn)有的 Go 代碼格式化,也就是在 gofumpt 之后運(yùn)行 gofmt 不會產(chǎn)生任何新的變化。
安裝命令:
$ go install mvdan.cc/gofumpt@latest
執(zhí)行命令:
$ gofumpt -l -w . main.go
再查看對應(yīng)被格式化的文件就已經(jīng)生效了。
以下是一些更具體的 gofmt 和 gofumpt 的區(qū)別例子。能夠很好的幫助大家識別其中的差異。
賦值運(yùn)算符后無空行
原本由 gofmt 格式化后:
func foo() string { foo := "腦子進(jìn)煎魚了!" return foo }
改為 gofumpt 格式化后:
func foo() string { foo := "腦子進(jìn)煎魚了!" return foo }
函數(shù)體周圍無空行
原本由 gofmt 格式化后:
func foo() { println("煎魚進(jìn)腦子了!") }
改為 gofumpt 格式化后:
func foo() { println("煎魚進(jìn)腦子了!") }
函數(shù)應(yīng)分隔 ) { ,縮進(jìn)有助于提高可讀性
原本由 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("煎魚?。?!") }
代碼塊中的單獨(dú)語句(或注釋)周圍沒有空行
原本由 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()
標(biāo)準(zhǔn)庫導(dǎo)入必須在頂部單獨(dú)分組
原本由 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 = "煎魚進(jìn)腦子了"
改為 gofumpt 格式化后:
s := "煎魚進(jìn)腦子了"
默認(rèn)啟用 -s 代碼簡化標(biāo)記。
非 Go 指令的注釋應(yīng)以空格開頭
原本由 gofmt 格式化后:
//go:noinline //Foo is awesome. func Foo() {}
改為 gofumpt 格式化后:
//go:noinline // Foo is awesome. func Foo() {}
VSCode 配置
可以直接在 IDE 中進(jìn)行配置。例如 VSCode,可以配置對應(yīng)的 settings.json 為如下:
{ "go.useLanguageServer": true, "gopls": { "formatting.gofumpt": true, }, }
就可以直接在 Go 應(yīng)用中用起來了。
總結(jié)
之前我有一個朋友,接手了一個老項目。那位同學(xué),幾乎沒有什么代碼規(guī)范的風(fēng)格。全靠 gofmt 來幫他格式化。
但你們也看到,gofmt 只做了最基本的。這種時候如果有更嚴(yán)格的 Go 代碼格式化工具 gofumpt 是非常不錯的。(也需要引導(dǎo)這位同學(xué),但容易撕逼)
像是前面提到的 “多行頂層聲明必須用空行隔開” 是非常有價值的。我是真的見過一大坨不加空行都擠一起的。看起來非常難受。
到此這篇關(guān)于Golang使用gofumpt進(jìn)行代碼格式化的文章就介紹到這了,更多相關(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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08golang如何部署到服務(wù)器及應(yīng)注意問題解析
這篇文章主要為大家介紹了golang如何部署到服務(wù)器及應(yīng)注意問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01golang 如何實(shí)現(xiàn)HTTP代理和反向代理
這篇文章主要介紹了golang 實(shí)現(xiàn)HTTP代理和反向代理的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Golang中println和fmt.Println區(qū)別解析
Golang 中打印數(shù)據(jù)通常使用 fmt.Println() 方法,也可以使用內(nèi)置的 println() 方法。這兩個方法大家可能都使用過,它們的區(qū)別是什么呢?本文給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2023-03-03詳解Go語言中Goroutine退出機(jī)制的原理及使用
goroutine是Go語言提供的語言級別的輕量級線程,在我們需要使用并發(fā)時,我們只需要通過?go?關(guān)鍵字來開啟?goroutine?即可。本文就來詳細(xì)講講Goroutine退出機(jī)制的原理及使用,感興趣的可以了解一下2022-07-07