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 語言本身並沒有原生支援強大的註解,僅限於以下兩種:
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語言有沒有註解的詳細內容。更多資訊請關注PHP中文網其他相關文章!