go語言沒有註解。go語言不支援註解的原因:1、Go在設計上更傾向於明確的、顯式的程式設計風格;2、對比現有程式碼方法,這種裝飾器的新的方法沒有提供比現有方法更多的優勢,大到足矣推翻原有的設計思路;3、社群內的投票,支援的也很少。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
特殊在於,Go 有些特性是其他語言有,他沒有的。最經典的就是 N 位 Java 同學尋找 Go 語言的註解在哪裡,總要解釋。
為此,今天煎魚就帶大家瞭解一下 Go 語言的註解的使用和情況。
註解(Annotation)最早出現自何處,翻了一圈並沒有找到。但可以明確,在註解的使用中,Java 註解最為經典,為了便於理解,因此我們基於 Java 做初步的註解理解。
在 2002 年,JSR-175 提出了 《A Metadata Facility for the Java Programming Language》,也就是為 Java 程式語言提供後設資料工具。
這就是現在使用最廣泛地註解(Annotation)的來源。範例如下:
// @annotation1// @annotation2func Hello() string { return ""}
登入後複製
在格式上均以 「@」 作為註解標識來使用。
摘抄自 @wikipedia 的一個註解例子:
//等同於 @Edible(value = true) @Edible(true) Item item = new Carrot(); public @interface Edible { boolean value() default false; } @Author(first = "Oompah", last = "Loompah") Book book = new Book(); public @interface Author { String first(); String last(); } // 該標註可以在執行時通過反射存取。 @Retention(RetentionPolicy.RUNTIME) // 該標註只用於類內方法。 @Target({ElementType.METHOD}) public @interface Tweezable { }
登入後複製
在上述例子中,通過註解去做了一系列的定義、宣告、賦值等。若是對語言既有註解不熟,或是做的比較複雜的註解,就會有一定的理解成本。
在業內也常常會說,註解就是 「在原始碼上進行編碼」,註解的存在,有著明確的優缺點。你覺得呢?
在註解的的作用上,分為如下幾點:
為編譯器提供資訊:註釋可以被編譯器用來檢測錯誤或支援警告。
編譯時和部署時處理:軟體工具可以處理註釋資訊以生成程式碼、XML檔案等。
執行時處理:有些註解可以在執行時檢查,並用於其他用途。
Go 語言本身並沒有原生支援強大的註解,僅限於以下兩種:
但這先按不足以作為一個函數註解來使用,也無法形成像 Python 那樣的裝飾器行為。
Go issues 上有人提過類似的提案,
Go Contributor @ianlancetaylor 給出了明確的答覆,Go 在設計上更傾向於明確的、顯式的程式設計風格。
思考的優缺點如下:
因如下原因,沒有接受註解:
可能有小夥伴會說了,有註解做裝飾器了,程式碼會簡潔不少。
對此 Go 團隊的態度很明確
Go 認為可讀性更重要,如果只是額外多寫一點程式碼,在權衡後,還是可以接受的。
雖然 Go 語言官方沒有原生的完整支援,但開源社群中也有小夥伴已經放出了大招,藉助各項周邊工具和庫來實現特定的函數註解功能。
GitHub 專案分別如下:
使用範例如下:
package tourdefrance//go:generate golangAnnotations -input-dir .// @RestService( path = "/api/tour" )type TourService struct{}type EtappeResult struct{ ... }// @RestOperation( method = "PUT", path = "/{year}/etappe/{etappeUid}" )func (ts *TourService) addEtappeResults(c context.Context, year int, etappeUid string, results EtappeResult) error { return nil}
登入後複製
對 Go 註解的使用感興趣的小夥伴可以自行查閱使用手冊。
我們更多的關心,Go 原生都沒支援,那麼開源庫都是如何實現的呢?在此我們藉助 MarcGrol/golangAnnotations 專案所提供的思路來講解。
分為三個步驟:
解析程式碼。
模板處理。
生成程式碼。
首先,我們需要用用 go/ast 標準庫獲取程式碼所生成的 AST Tree 中需要的內容和結構。
範例程式碼如下:
parsedSources := ParsedSources{ PackageName: "tourdefrance", Structs: []model.Struct{ { DocLines: []string{"// @RestService( path = "/api/tour" )"}, Name: "TourService", Operations: []model.Operation{ { DocLines: []string{"// @RestOperation( method = "PUT", path = "/{year}/etappe/{etappeUid}"}, ... }, }, }, },}
登入後複製
我們可以看到,在 AST Tree 中能夠獲取到在範例程式碼中所定義的註解內容,我們就可以依據此去做很多奇奇怪怪的事情了。
緊接著,在知道了註解的輸入是什麼後,我們只需要根據實際情況,編寫對應的模板生成器 code-generator 就可以了。
我們會基於 text/template 標準庫來實現,比較經典的像是 kubernetes/code-generator 是一個可以參考的實現。
程式碼實現完畢後,將其編譯成 go plugin,便於我們在下一步呼叫就可以了。
最後,萬事俱備只欠東風。差的就是告訴工具,哪些 Go 檔案中包含註解,需要我們去生成的。
這時候我們可以使用 //go:generate
在 Go 檔案宣告。就像前面的專案中所說的:
//go:generate golangAnnotations -input-dir .
登入後複製
宣告該 Go 檔案需要生成,並呼叫前面編寫好的 golangAnnotations 二進位制檔案,就可以實現基本的 Go 註解生成了。
今天在這篇文章中,我們介紹了註解(Annotation)的歷史背景。同時我們針對 Go 語言目前原生的註解支援情況進行了說明。
也面向為什麼 Go 沒有像 Java 那樣支援強大的註解進行了基於 Go 官方團隊的原因解釋。如果希望在 Go 實現註解的,也提供了相應的開源技術方案。
【相關推薦:Go視訊教學、】
以上就是go語言有沒有註解的詳細內容,更多請關注TW511.COM其它相關文章!