溫馨提示×

溫馨提示×

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

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

go語言有注解嗎

發(fā)布時間:2023-01-28 09:36:42 來源:億速云 閱讀:144 作者:iii 欄目:編程語言

今天小編給大家分享一下go語言有注解嗎的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

go語言沒有注解。go語言不支持注解的原因:1、Go在設(shè)計上更傾向于明確的、顯式的編程風(fēng)格;2、對比現(xiàn)有代碼方法,這種裝飾器的新的方法沒有提供比現(xiàn)有方法更多的優(yōu)勢,大到足矣推翻原有的設(shè)計思路;3、社區(qū)內(nèi)的投票,支持的也很少。

什么是注解

了解歷史

注解(Annotation)最早出現(xiàn)自何處,翻了一圈并沒有找到。但可以明確,在注解的使用中,Java 注解最為經(jīng)典,為了便于理解,因此我們基于 Java 做初步的注解理解。

go語言有注解嗎

在 2002 年,JSR-175 提出了 《A Metadata Facility for the Java Programming Language》,也就是為 Java 編程語言提供元數(shù)據(jù)工具。

這就是現(xiàn)在使用最廣泛地注解(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)   // 該標注只用于類內(nèi)方法。  @Target({ElementType.METHOD})  public @interface Tweezable {  }

在上述例子中,通過注解去做了一系列的定義、聲明、賦值等。若是對語言既有注解不熟,或是做的比較復(fù)雜的注解,就會有一定的理解成本。

在業(yè)內(nèi)也常常會說,注解就是 “在源碼上進行編碼”,注解的存在,有著明確的優(yōu)缺點。你覺得呢?

注解的作用

在注解的的作用上,分為如下幾點:

  • 為編譯器提供信息:注釋可以被編譯器用來檢測錯誤或支持警告。

  • 編譯時和部署時處理:軟件工具可以處理注釋信息以生成代碼、XML文件等。

  • 運行時處理:有些注解可以在運行時檢查,并用于其他用途。

Go 注解在哪里

現(xiàn)狀

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

  • 編譯時生成:go:generate

  • 編譯時約束:go:build

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

為什么不支持

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

Go Contributor @ianlancetaylor 給出了明確的答復(fù),Go 在設(shè)計上更傾向于明確的、顯式的編程風(fēng)格。

思考的優(yōu)缺點如下:

  • 優(yōu)勢:不知道 Go 能從添加裝飾器中得到什么好處,沒能在 issues 上明確論證。

  • 缺點:是明確的,會存在意外設(shè)置的情況。

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

  • 對比現(xiàn)有代碼方法,這種裝飾器的新的方法沒有提供比現(xiàn)有方法更多的優(yōu)勢,大到足矣推翻原有的設(shè)計思路。

  • 社區(qū)內(nèi)的投票,支持的也很少(基于表情符號的投票),用戶反饋不多。

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

對此 Go 團隊的態(tài)度很明確

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

用 Go 實現(xiàn)注解

雖然 Go 語言官方?jīng)]有原生的完整支持,但開源社區(qū)中也有小伙伴已經(jīng)放出了大招,借助各項周邊工具和庫來實現(xiàn)特定的函數(shù)注解功能。

GitHub 項目分別如下:

  • MarcGrol/golangAnnotations

  • u2takey/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}

我們更多的關(guān)心,Go 原生都沒支持,那么開源庫都是如何實現(xiàn)的呢?在此我們借助 MarcGrol/golangAnnotations 項目所提供的思路來講解。

分為三個步驟:

  • 解析代碼。

  • 模板處理。

  • 生成代碼。

解析 AST

首先,我們需要用用 go/ast 標準庫獲取代碼所生成的 AST Tree 中需要的內(nèi)容和結(jié)構(gòu)。

示例代碼如下:

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 中能夠獲取到在示例代碼中所定義的注解內(nèi)容,我們就可以依據(jù)此去做很多奇奇怪怪的事情了。

模板生成

緊接著,在知道了注解的輸入是什么后,我們只需要根據(jù)實際情況,編寫對應(yīng)的模板生成器 code-generator 就可以了。

我們會基于 text/template 標準庫來實現(xiàn),比較經(jīng)典的像是 kubernetes/code-generator 是一個可以參考的實現(xiàn)。

代碼實現(xiàn)完畢后,將其編譯成 go plugin,便于我們在下一步調(diào)用就可以了。

代碼生成

最后,萬事俱備只欠東風(fēng)。差的就是告訴工具,哪些 Go 文件中包含注解,需要我們?nèi)ド傻摹?/p>

這時候我們可以使用 //go:generate 在 Go 文件聲明。就像前面的項目中所說的:

//go:generate golangAnnotations -input-dir .

聲明該 Go 文件需要生成,并調(diào)用前面編寫好的 golangAnnotations 二進制文件,就可以實現(xiàn)基本的 Go 注解生成了。

以上就是“go語言有注解嗎”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI