中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go fmt命令有什么用

發布時間:2023-01-31 09:23:33 來源:億速云 閱讀:102 作者:iii 欄目:編程語言

本篇內容介紹了“go fmt命令有什么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在go語言中,“go fmt”命令主要是用來幫開發者格式化所寫好的代碼文件。“go fmt”命令會按照Go語言代碼規范格式化指定代碼包中的所有Go語言源碼文件的代碼,所有Go語言源碼文件即包括命令源碼文件、庫源碼文件和測試源碼文件。“go fmt”命令只會格式化被直接保存在指定代碼包對應目錄下的Go語言源碼文件。

go fmt命令介紹

對于一門編程語言來說,代碼格式化是最容易引起爭議的一個問題,不同的開發者可能會有不同的編碼風格和習慣,但是如果所有開發者都能使用同一種格式來編寫代碼,那么開發者就可以將主要精力放在語言要解決的問題上,從而節省開發時間。

Go語言的開發團隊制定了統一的官方代碼風格,并且推出了 gofmt 工具(gofmt 或 go fmt)來幫助開發者格式化他們的代碼到統一的風格。

gofmt 是一個 cli 程序,會優先讀取標準輸入,如果傳入了文件路徑的話,會格式化這個文件,如果傳入一個目錄,會格式化目錄中所有 .go 文件,如果不傳參數,會格式化當前目錄下的所有 .go 文件。

而Go語言中還有一個go fmt命令,go fmt命令是 gofmt 的簡單封裝。

go fmt命令有什么用

go fmt命令主要是用來幫你格式化所寫好的代碼文件【很多第三方集成軟件都是使用了go fmt命令】

使用:

go fmt <文件名>.go

使用go fmt命令,更多時候是用gofmt,而且需要參數-w,否則格式化結果不會寫入文件。gofmt -w src,可以格式化整個項目。

參數介紹

  • -l 顯示那些需要格式化的文件

  • -w 把改寫后的內容直接寫入到文件中,而不是作為結果打印到標準輸出。

  • -r 添加形如“a[b:len(a)] -> a[b:]”的重寫規則,方便我們做批量替換

  • -s 簡化文件中的代碼

  • -d 顯示格式化前后的diff而不是寫入文件,默認是false

  • -e 打印所有的語法錯誤到標準輸出。如果不使用此標記,則只會打印不同行的前10個錯誤。

  • -cpuprofile 支持調試模式,寫入相應的cpufile到指定的文件 作用區域

go fmt與gofmt

go fmt命令會按照Go語言代碼規范格式化指定代碼包中的所有Go語言源碼文件的代碼,所有Go語言源碼文件即包括命令源碼文件、庫源碼文件和測試源碼文件。注意,當代碼包還有子代碼包時,子代碼包中的Go語言源碼文件是不包含在內的。也就是說,go fmt命令只會格式化被直接保存在指定代碼包對應目錄下的Go語言源碼文件。

與go doc命令和godoc命令的關系類似,go fmt命令是gofmt命令的簡單封裝。go fmt命令本身可以接受兩個標記。標記-n可以讓命令程序僅打印出內部使用的gofmt命令及其標記和參數而不真正執行它。標記-x則會使命令程序既打印又執行這個命令。在go fmt命令程序內部,會在其調用的gofmt命令后面加上標記-l和-w,并以指定代碼包中的所有Go語言源碼文件的路徑作為參數,就像這樣:

hc@ubt:~$ go fmt -n pkgtool
gofmt -l -w golang/goc2p/src/pkgtool/envir.go golang/goc2p/src pkgtoolenvir_test.go golang/goc2p/src/pkgtool/fpath.go golang/goc2p/src/pkgtool ipath.go golang/goc2p/src/pkgtool/pnode.go golang/goc2p/src/pkgtool/util.go golang/goc2p/src/pkgtool/util_test.go

注意,作為gofmt命令參數的Go語言源碼文件的路徑是相對的,而不是絕對的。不過這只是為了讓參數看起來更短一些而已。所以,當我們直接執行gofmt命令的時候,使用源碼文件的絕對路徑作為參數也是沒有問題的。實際上,任何Go源碼文件或包含有Go語言源碼文件的目錄的相對路徑或絕對路徑都可以作為gofmt命令的參數。當使用包含有Go語言源碼文件的目錄的絕對路徑或相對路徑作為參數時,gofmt命令會把在這個目錄下的Go語言源碼文件作為目標源碼文件。

go fmt命令程序內部在執行gofmt命令時加入的標記是固定的。如果我們想使用與之不同的標記集合就必須直接使用gofmt命令了。現在我們來看一下gofmt命令可接受的所有標記。如下表。

表0-13 gofmt命令的標記說明

標記名稱標記描述
-cpuprofile把CPU概要寫入指定文件。文件的路徑應該作為此標記的值。
-d顯示格式化前后的不同(如果有的話),而不是直接格式化那些代碼。
-e報告目標源碼文件中的所有錯誤。默認情況下,僅會顯示前10個錯誤。
-l僅把那些不符合格式化規范的、需要被命令程序改寫的源碼文件的絕對路徑打印到標準輸出。而不是把改寫后的全部內容都打印到標準輸出。
-r添加形如“a[b:len(a)] -> a[b:]”的重寫規則。如果我們需要自定義某些額外的格式化規則,就需要用到它。規則字符串應該作為此標記的值。
-s簡化文件中的代碼。
-w把改寫后的內容直接寫入到文件中,而不是作為結果打印到標準輸出。

看過上表中的信息,我們就很容易理解go fmt命令的行為了。因為它在內部執行了gofmt命令,并加入了標記-l和-w。這會使命令程序打印需要改寫的文件的絕對路徑到標準輸出,并且直接把格式化后的內容寫入到原始文件中。在默認情況下,gofmt命令會把格式化后的內容直接打印到標準輸出上。

實際上,命令程序會把目標源碼文件中的內容解析成抽象語法樹。當在解析過程中發現語法錯誤時,命令程序就會顯示錯誤提示信息并退出。在默認情況下,目標源碼文件中的語法錯誤不會全部被顯示出來。我們可以加入標記-e以使命令程序打印出全部錯誤到標準輸出。

自定義改寫操作

在默認情況下,gofmt命令對Go語言源碼文件的改寫操作包括如下幾個方面:

  • 以字典序排序依賴包導入語句塊中代碼包導入路徑的先后順序。

  • 標準化各個語言或語句塊之間的縮進、空格和換行。比如,把所有的\r\n轉換成\n。

  • 對代碼語法的小修正。比如,消除用于判斷變量類型的switch語句塊中多余的圓括號。

如果想自定義額外的改寫操作,需要使用-r標記。-r標記的值中必須包含“->”,比如a[b:len(a)] -> a[b:]。“->”的左邊應該是需要被替代的表達式的示例,而右邊則應該是用來替代“->”左邊表達式的表達式的示例。

如果我們使用標記-r,那么命令程序在解析源碼文件之前會將此標記值中的被替換表達式和替換表達式分別解析為抽象語法樹的表達式節點。如果解析不成功,也就意味著無法進行后續的替換操作,命令程序會在打印錯誤提示信息后退出。如果解析成功,那么命令程序會在解析源碼文件成功之后進行表達式替換操作。命令程序會尋找該源碼文件的抽象語法樹中與被替換表達式相匹配的節點,并用替換表達式替換之。gofmt命令已支持但不限于如下自定義替換操作:

  • 程序實體名稱的替換。程序實體包括變量、常量、函數、結構體和接口。比如:-r=array1->array2和-r=FuncA->FuncB。

  • 程序實體類型的替換,其中也包含函數的參數和結果的類型的替換。比如:-r=string->bool和-r=interface{}->int。

  • 多余圓括號的清除。比如:我們這樣設置標記-r=(x)->x會使目標代碼中的a = (-x.s)被改寫為a = -x.s,也會使代碼中的((b = -x.f()))被改寫為b = -x.f(),還會使c = -(x).f改寫為c = -x.f,但是不會去掉d = (&x).s和e = (-x).f()中的圓括號。也就是說,命令程序會在不改變語義和不產生語法歧義的前提下清除代碼中多余的圓括號。

  • 數值操作的替換。比如:我們這樣設置標記-r=x+x->x*2會使代目標碼中的所有的x + x被替換為x * 2。并且,如果需要被替換的表達式中包含注釋的話,則在替換操作的過程中會去掉這些注釋。比如,在同樣的標記設置的情況下x /* It's comment */ + x仍然會被替換為x * 2。

  • 基于參數列表的函數調用替換。比如:如果我們這樣設置標記-r='funcA(a)->FuncA(a, c)',則目標代碼中調用函數funcA并以一個變量作為參數的語句都會被替換為調用函數FuncA并以變量a和變量c作為參數的語句。注意,被替換表達式中作為參數的a只是表明函數funcA有一個參數,而并不關心這個參數的名稱是什么。也就是說,在同樣的標記設置的情況下,目標代碼中的funcA(b)或funcA(x)都會被替換為FuncA(a, c)。再或者,如果我們這樣設置標記-r='funB(x...)->FunC(x)',則目標代碼中的funB(x...)或funB(y...)或其它類似的調用函數都會被替換為FunC(x)。其中,當類型為數組/切片的參數后跟三個英文半角句號“…”時,則表明需要把這個參數中的每一個元素都作為單獨的參數傳入到函數中。因此,這種替換方式可以用來在函數名稱和/或參數列表改變之后,批量的跟進修正調用該函數的代碼。

代碼簡化操作

當我們在執行gofmt命令時加入了標記-s,命令程序會在目標源碼文件中尋找可以簡化的代碼并簡化它。簡化操作包括:

  • 消除在數組/切片初始化中的不必要的類型聲明。

  • 消除在字典初始化中的不必要的類型聲明。

  • 消除在數組/切片切片操作時不必要的索引指定。

  • 消除迭代時的非必要臨時變量賦值操作。

這些操作基本上都是出于盡量使用Go語言的語法糖已達到減少代碼量的目的。我們在編寫Go語言代碼的時候應該直接使用這些語法糖而不應該依賴使用gofmt命令來簡化。這里所說的Go語言的語法糖,我們在第3章中已經有所介紹。

我們在本小節中詳細介紹了go fmt命令和gofmt命令。下面我們再匯總一下這兩個命令可以為我們做的事情。如下表。

表0-14 go fmt命令和gofmt命令的功能

功能go fmt命令gofmt命令
格式化代碼
列出不規范的源碼文件
自動改寫源碼文件
顯示對比信息×
提示全部錯誤×
簡化代碼×
自定義替換/重構輔助×
CPU概要記錄×

最后,值得一提的是,當我們執行gofmt命令且沒有加任何參數的時候,該命令將會進入到交互模式。在這種模式下,我們可以直接在命令行界面中輸入源碼,并以Ctrl-d結束。在Linux操作系統下,Ctrl-d代表EOF(End Of File,中文譯為文件結束符)。需要注意的是,如果在一行的中間按下Ctrl-d,則表示輸出“標準輸入”的緩存區,所以這時必須連續按兩次Ctrl-d。另外,在Windows操作系統下,Ctrl-z代表EOF,所以需要以Ctrl-z結束。在這之后,gofmt命令會像從源碼文件中讀取源碼那樣從命令行界面(也稱為標準輸入)讀取源碼,并在格式化后將結果打印到命令行界面(也稱為標準輸出)中。示例如下:

hc@ubt:~$ gofmt -r='fmt.Println(a)->fmt.Printf("%s\n", a)'
if a=="print" {fmt.Println(a)}                            <----- 在此行的末尾鍵入回車和Ctrl-d。
warning: rewrite ignored for incomplete programs          <----- 此行及以下就是命令輸出的內容。
if a == "print" {
        fmt.Println(a)
}

由上述示例可知,我們可以使用gofmt命令的交互模式格式化任意的代碼片段。雖然會顯示一行警告信息,但是格式化后的結果仍然會被打印出來。并且,在交互模式下,當我們輸入的代碼片段不符合Go語言的語法規則時,命令程序也會打印出錯誤提示信息。在其它方面,命令程序在交互模式與普通模式下的行為也是基本一致的。

“go fmt命令有什么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闸北区| 呼伦贝尔市| 桓仁| 蚌埠市| 商水县| 新巴尔虎右旗| 阳谷县| 姚安县| 辽阳市| 南部县| 平泉县| 松原市| 延长县| 商城县| 深泽县| 双柏县| 偃师市| 宁都县| 英吉沙县| 漳州市| 罗平县| 杭锦后旗| 密山市| 岳阳市| 雅江县| 寻甸| 澎湖县| 龙井市| 景泰县| 深州市| 大同县| 普兰县| 礼泉县| 丁青县| 肇庆市| 鄄城县| 饶阳县| 筠连县| 益阳市| 白山市| 洪雅县|