Go 言語には注釈がありません。 Go 言語がアノテーションをサポートしない理由: 1. Go は設計において明確で明示的なプログラミング スタイルを好みます; 2. 既存のコード メソッドと比較して、この新しいデコレータ メソッドは既存のメソッド以上の機能を提供しません。元の設計アイデアを覆すのに十分な量; 3. コミュニティ内の投票からの支持がほとんどありません。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
特別なことは、Go には他の言語にはないいくつかの機能があることです。最も古典的なものは、N 人の Java 学生が Go 言語のアノテーションがどこにあるのかを探しており、常に説明しなければならないというものです。
この目的を達成するために、今日は Jianyu が Go 言語のアノテーションの使用法と状況について説明します。
アノテーションとは
歴史を理解する
アノテーションが初めて登場した場所は見つかりませんでした。ただし、アノテーションの使用において Java アノテーションが最も古典的であることは明らかであり、理解を容易にするために、Java に基づくアノテーションについて予備的な理解を行います。
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 语言官方没有原生的完整支持,但开源社区中也有小伙伴已经放出了大招,借助各项周边工具和库来实现特定的函数注解功能。
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言語にはアノテーションがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

GolangとPythonの主な違いは、並行性モデル、タイプシステム、パフォーマンス、実行速度です。 1. GolangはCSPモデルを使用します。これは、同時タスクの高いタスクに適しています。 Pythonは、I/O集約型タスクに適したマルチスレッドとGILに依存しています。 2。Golangは静的なタイプで、Pythonは動的なタイプです。 3.ゴーランコンパイルされた言語実行速度は高速であり、Python解釈言語開発は高速です。

Golangは通常Cよりも遅くなりますが、Golangはプログラミングと開発効率の同時により多くの利点があります。1)Golangのゴミ収集と並行性モデルにより、同時性の高いシナリオではうまく機能します。 2)Cは、手動のメモリ管理とハードウェアの最適化により、より高いパフォーマンスを取得しますが、開発の複雑さが高くなります。

GolangはクラウドコンピューティングとDevOpsで広く使用されており、その利点はシンプルさ、効率性、および同時プログラミング機能にあります。 1)クラウドコンピューティングでは、GolangはGoroutineおよびチャネルメカニズムを介して同時リクエストを効率的に処理します。 2)DevOpsでは、Golangの高速コンピレーションとクロスプラットフォーム機能により、自動化ツールの最初の選択肢になります。

GolangとCにはそれぞれ、パフォーマンス効率に独自の利点があります。 1)GolangはGoroutineおよびGarbage Collectionを通じて効率を向上させますが、一時停止時間を導入する場合があります。 2)Cは、手動のメモリ管理と最適化を通じて高性能を実現しますが、開発者はメモリリークやその他の問題に対処する必要があります。選択するときは、プロジェクトの要件とチームテクノロジースタックを考慮する必要があります。

Golangは高い並行性タスクにより適していますが、Pythonには柔軟性がより多くの利点があります。 1.Golangは、GoroutineとChannelを介して並行性を効率的に処理します。 2。Pythonは、GILの影響を受けるが、複数の並行性メソッドを提供するスレッドとAsyncioに依存しています。選択は、特定のニーズに基づいている必要があります。

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

seetgolangforhighperformance andconcurrency、ithyforbackendservicesandnetworkプログラミング、selectthonforrapiddevelopment、datascience、andmachinelearningduetoistsversitydextentextensextensentensiveLibraries。

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。
