目錄
什麼是註解
了解歷史
註解範例
註解的作用
Go 註解在哪裡
#現況
用 Go 实现注解
解析 AST
模板生成
代码生成
总结
首頁 後端開發 Golang go語言有沒有註解

go語言有沒有註解

Jan 18, 2023 pm 04:51 PM
golang go語言

go語言沒有註解。 go語言不支持註解的原因:1、Go在設計上更傾向於明確的、顯式的程式設計風格;2、對比現有程式碼方法,這種裝飾器的新的方法並沒有提供比現有方法更多的優勢,大到足矣推翻原有的設計思維;3、社區內的投票,支持的也很少。

go語言有沒有註解

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

特殊在於,Go 有些特質是其他語言有,他沒有的。最經典的就是 N 位 Java 同學尋找 Go 語言的註解在哪裡,總是解釋。

為此,今天煎魚就帶大家了解 Go 語言的註解的使用和情況。

什麼是註解

了解歷史

註解(Annotation)最早出現自何處,翻了一圈並沒有找到。但可以明確,在註解的使用中,Java 註解最為經典,為了方便理解,因此我們基於 Java 做初步的註解理解。

go語言有沒有註解

在 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/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}
登入後複製

对 Go 注解的使用感兴趣的小伙伴可以自行查阅使用手册。

我们更多的关心,Go 原生都没支持,那么开源库都是如何实现的呢?在此我们借助 MarcGrol/golangAnnotations 项目所提供的思路来讲解。

分为三个步骤:

  • 解析代码。

  • 模板处理。

  • 生成代码。

解析 AST

首先,我们需要用用 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語言有沒有註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

多進程日誌寫入如何保證並發安全又高效? 多進程日誌寫入如何保證並發安全又高效? Apr 02, 2025 pm 03:51 PM

高效處理多進程日誌寫入的並發安全問題多進程同時寫入同一個日誌文件,如何保證並發安全且高效?這是一個...

See all articles