目次
アノテーションとは
歴史を理解する
アノテーションの例
アノテーションの役割
Go のアノテーションはどこにありますか
現在の状況
なぜサポートしないのか
用 Go 实现注解
解析 AST
模板生成
代码生成
总结
ホームページ バックエンド開発 Golang Go言語にはアノテーションがありますか?

Go言語にはアノテーションがありますか?

Jan 18, 2023 pm 04:51 PM
golang 言語を移動

Go 言語には注釈がありません。 Go 言語がアノテーションをサポートしない理由: 1. Go は設計において明確で明示的なプログラミング スタイルを好みます; 2. 既存のコード メソッドと比較して、この新しいデコレータ メソッドは既存のメソッド以上の機能を提供しません。元の設計アイデアを覆すのに十分な量; 3. コミュニティ内の投票からの支持がほとんどありません。

Go言語にはアノテーションがありますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

特別なことは、Go には他の言語にはないいくつかの機能があることです。最も古典的なものは、N 人の Java 学生が Go 言語のアノテーションがどこにあるのかを探しており、常に説明しなければならないというものです。

この目的を達成するために、今日は Jianyu が Go 言語のアノテーションの使用法と状況について説明します。

アノテーションとは

歴史を理解する

アノテーションが初めて登場した場所は見つかりませんでした。ただし、アノテーションの使用において Java アノテーションが最も古典的であることは明らかであり、理解を容易にするために、Java に基づくアノテーションについて予備的な理解を行います。

Go言語にはアノテーションがありますか?

2002 年、JSR-175 は、Java プログラミング言語用のメタデータ ツールを提供する「A Metadata Facility for the Java Programming Language」を提案しました。

これは、最も広く使用されているアノテーション (アノテーション) のソースです。例は次のとおりです。

// @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 言語自体はネイティブではありません。強力なサポート アノテーションは次の 2 つのタイプに限定されます:

  • コンパイル時の生成: go:generate
  • コンパイル時の制約: go:build

しかし、最初に押す これは関数のアノテーションとして使用するのに十分ではなく、Python のようなデコレータの動作を形成することもできません。

なぜサポートしないのか

誰かが Go の問題に関して同様の提案をしました。

Go コントリビューターである @ianlancetaylor が明確な答えを出しました。Goは、明確で明示的なプログラミング スタイルを優先するように設計されています。

考えることの利点と欠点は次のとおりです:

    利点: デコレーターを追加することで Go にどのような利点が得られるのかがわかりません。明確に理解できていません。それを問題で実証してください。
  • 欠点: 偶発的な設定が発生する可能性があることは明らかです。
注釈は次の理由により受け入れられません:

    既存のコード メソッドと比較すると、このデコレータの新しいメソッドには既存のメソッド以上の利点はありません。元の設計思想を覆すには十​​分です。
  • コミュニティ内での投票 (絵文字に基づく投票) に対するサポートはほとんどなく、ユーザーからのフィードバックもあまりありません。
友人の中には、デコレータとしてアノテーションがあればコードがずっと単純になるという人もいるかもしれません。

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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golang Generic Function Typeの制約がVSCodeで自動的に削除されるという問題を解決する方法は? Golang Generic Function Typeの制約がVSCodeで自動的に削除されるという問題を解決する方法は? Apr 02, 2025 pm 02:15 PM

VSCODEユーザーのGolang Generic Function Typeの制約の自動削除は、VSCODEを使用してGolangコードを書くときに奇妙な問題に遭遇する可能性があります。いつ...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

See all articles