go語言有沒有注解-全球觀天下

          來源:php中文網 | 2023-01-18 17:52:30 |

          本教程操作環境: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 注解在哪里

          現狀

          Go 語言本身并沒有原生支持強大的注解,僅限于以下兩種:

          編譯時生成:go:generate編譯時約束:go:build

          但這先按不足以作為一個函數注解來使用,也無法形成像 Python 那樣的裝飾器行為。

          為什么不支持

          Go issues 上有人提過類似的提案,

          Go Contributor @ianlancetaylor 給出了明確的答復,Go 在設計上更傾向于明確的、顯式的編程風格

          思考的優缺點如下:

          優勢:不知道 Go 能從添加裝飾器中得到什么好處,沒能在 issues 上明確論證。缺點:是明確的,會存在意外設置的情況。

          因如下原因,沒有接受注解:

          對比現有代碼方法,這種裝飾器的新的方法沒有提供比現有方法更多的優勢,大到足矣推翻原有的設計思路。社區內的投票,支持的也很少(基于表情符號的投票),用戶反饋不多。

          可能有小伙伴會說了,有注解做裝飾器了,代碼會簡潔不少。

          對此 Go 團隊的態度很明確

          Go 認為可讀性更重要,如果只是額外多寫一點代碼,在權衡后,還是可以接受的。

          用 Go 實現注解

          雖然 Go 語言官方沒有原生的完整支持,但開源社區中也有小伙伴已經放出了大招,借助各項周邊工具和庫來實現特定的函數注解功能。

          GitHub 項目分別如下:

          MarcGrol/golangAnnotationsu2takey/go-annotation

          使用示例如下:

          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 項目所提供的思路來講解。

          分為三個步驟:

          解析代碼。

          模板處理。

          生成代碼。

          解析 AST

          首先,我們需要用用 go/ast 標準庫獲取代碼所生成的 AST Tree 中需要的內容和結構。

          示例代碼如下:

          parsedSources := ParsedSources{    PackageName: "tourdefrance",    Structs:     []model.Struct{        {            DocLines:   []string{"http:// @RestService( path = "/api/tour" )"},            Name:       "TourService",            Operations: []model.Operation{                {                   DocLines:   []string{"http:// @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語言有沒有注解的詳細內容,更多請關注php中文網其它相關文章!

          關鍵詞: go語言 Golang

          亚洲人成网站影音先锋播放| 亚洲人成在线播放| 亚洲视频在线观看免费视频| 亚洲精品自在在线观看| 亚洲激情视频在线观看| 亚洲精品永久在线观看| 亚洲专区中文字幕| 亚洲制服丝袜精品久久| 久久久久久久亚洲精品| 精品国产亚洲一区二区三区在线观看 | 精品亚洲成A人无码成A在线观看 | 成人亚洲国产精品久久| mm1313亚洲国产精品无码试看| 亚洲人成日本在线观看| 亚洲精品白色在线发布| 亚洲色图古典武侠| 亚洲国产精品张柏芝在线观看 | 亚洲国产成人久久综合碰| 亚洲免费在线播放| 亚洲AV人无码综合在线观看| 亚洲AV无码乱码国产麻豆| 亚洲va在线va天堂va不卡下载| 亚洲成a人片77777老司机| 亚洲视频中文字幕| 亚洲视频一区二区在线观看| 亚洲白嫩在线观看| 亚洲youjizz| 亚洲精品色播一区二区| 亚洲aⅴ天堂av天堂无码麻豆| 无码色偷偷亚洲国内自拍| 亚洲精品线路一在线观看| 日韩一卡2卡3卡4卡新区亚洲| 亚洲精品tv久久久久久久久 | 亚洲狠狠婷婷综合久久蜜芽| 亚洲AV无码之国产精品| 亚洲福利视频一区二区| 亚洲色欲一区二区三区在线观看 | 久热综合在线亚洲精品| 久久亚洲精品无码VA大香大香| 亚洲国产成人精品青青草原| 亚洲日韩精品无码AV海量|