Table des matières
Qu'est-ce qu'une annotation
Comprendre l'historique
Exemple d'annotation
Le rôle des annotations
Où sont les annotations Go
Situation actuelle
Pourquoi ne pas soutenir
用 Go 实现注解
解析 AST
模板生成
代码生成
总结
Maison développement back-end Golang La langue Go a-t-elle des annotations ?

La langue Go a-t-elle des annotations ?

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

La langue Go n'a pas d'annotations. Les raisons pour lesquelles le langage go ne prend pas en charge les annotations : 1. Go préfère un style de programmation clair et explicite dans la conception ; 2. Par rapport aux méthodes de code existantes, cette nouvelle méthode de décorateur n'apporte pas plus que les méthodes existantes. suffisamment pour renverser l'idée de conception originale ; 3. Il y a très peu de soutien des votes dans la communauté.

La langue Go a-t-elle des annotations ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

La particularité est que Go possède des fonctionnalités que d'autres langages n'ont pas. La plus classique est que les étudiants de N Java cherchent où se trouvent les annotations du langage Go et doivent toujours expliquer.

À cette fin, Jianyu vous amènera aujourd'hui à comprendre l'utilisation et la situation des annotations du langage Go.

Qu'est-ce qu'une annotation

Comprendre l'historique

Où l'annotation est-elle apparue pour la première fois ? J'ai regardé autour de moi et je ne l'ai pas trouvée ? Mais il est clair que dans l'utilisation des annotations, les annotations Java sont les plus classiques. Afin de faciliter la compréhension, nous faisons une compréhension préalable des annotations basées sur Java.

La langue Go a-t-elle des annotations ?

En 2002, JSR-175 a proposé "Une installation de métadonnées pour le langage de programmation Java", qui doit fournir des outils de métadonnées pour le langage de programmation Java.

C'est la source de l'annotation la plus utilisée aujourd'hui. Exemples :

// @annotation1// @annotation2func Hello() string {        return ""}
Copier après la connexion

est formaté avec « @ » comme marque d'annotation.

Exemple d'annotation

Extrait d'un exemple d'annotation de @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 {  }
Copier après la connexion

Dans l'exemple ci-dessus, une série de définitions, de déclarations, d'affectations, etc. sont réalisées via des annotations. Si vous n'êtes pas familier avec les annotations existantes du langage, ou si vous faites des annotations plus complexes, il y aura un certain coût de compréhension.

On dit souvent dans l'industrie que les annotations sont un « codage sur le code source » L'existence d'annotations présente des avantages et des inconvénients évidents. Qu'en penses-tu?

Le rôle des annotations

Les fonctions des annotations sont divisées selon les points suivants :

  • Fournir des informations au compilateur : Les annotations peuvent être utilisées par le compilateur pour détecter des erreurs ou prendre en charge des avertissements.

  • Traitement au moment de la compilation et du déploiement : les outils logiciels peuvent traiter les informations d'annotation pour générer du code, des fichiers XML, etc.

  • Traitement à l'exécution : certaines annotations peuvent être vérifiées au moment de l'exécution et utilisées à d'autres fins.

Où sont les annotations Go

Situation actuelle

Le langage Go lui-même ne prend pas en charge nativement les annotations puissantes, limitées aux deux types suivants :

  • Génération au moment de la compilation : go:generate
  • Contraintes de temps de compilation : go:build

Mais cela ne suffit pas pour être utilisé comme annotation de fonction, et cela ne peut pas non plus former un comportement de décorateur comme Python.

Pourquoi ne pas soutenir

Quelqu'un a fait une proposition similaire sur les problèmes de Go,

Le contributeur de Go @ianlancetaylor a donné une réponse claire, Go préfère un style de programmation clair et explicite.

Les avantages et les inconvénients de la réflexion sont les suivants :

  • Avantages : Je ne sais pas quels avantages Go peut tirer de l'ajout de décorateurs, et je n'ai pas pu le démontrer clairement dans les numéros.
  • Inconvénients : Il est clair qu'il y aura des réglages accidentels.

Les annotations ne sont pas acceptées pour les raisons suivantes :

  • Par rapport aux méthodes de code existantes, cette nouvelle méthode de décorateur n'offre pas plus d'avantages que les méthodes existantes et est suffisamment grande pour renverser l'idée de conception originale.
  • Il y a très peu de support pour le vote au sein de la communauté (vote basé sur des émoticônes), et il n'y a pas beaucoup de retours de la part des utilisateurs.

Certains amis diront peut-être que s'il y a des annotations en tant que décorateurs, le code sera beaucoup plus simple.

L'attitude de l'équipe Go à ce sujet est très claire

Go pense que la lisibilité est plus importante Si vous écrivez juste un peu plus de code, c'est toujours acceptable après avoir pesé la balance.

用 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}
Copier après la connexion

对 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}"},                   ...                },            },        },    },}
Copier après la connexion

我们可以看到,在 AST Tree 中能够获取到在示例代码中所定义的注解内容,我们就可以依据此去做很多奇奇怪怪的事情了。

模板生成

紧接着,在知道了注解的输入是什么后,我们只需要根据实际情况,编写对应的模板生成器 code-generator 就可以了。

我们会基于 text/template 标准库来实现,比较经典的像是 kubernetes/code-generator 是一个可以参考的实现。

代码实现完毕后,将其编译成 go plugin,便于我们在下一步调用就可以了。

代码生成

最后,万事俱备只欠东风。差的就是告诉工具,哪些 Go 文件中包含注解,需要我们去生成的。

这时候我们可以使用 //go:generate 在 Go 文件声明。就像前面的项目中所说的:

//go:generate golangAnnotations -input-dir .
Copier après la connexion

声明该 Go 文件需要生成,并调用前面编写好的 golangAnnotations 二进制文件,就可以实现基本的 Go 注解生成了。

总结

今天在这篇文章中,我们介绍了注解(Annotation)的历史背景。同时我们针对 Go 语言目前原生的注解支持情况进行了说明。

也面向为什么 Go 没有像 Java 那样支持强大的注解进行了基于 Go 官方团队的原因解释。如果希望在 Go 实现注解的,也提供了相应的开源技术方案。


【相关推荐:Go视频教程编程教学

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Comment résoudre le problème des contraintes de type de fonction générique de Golang en cours de suppression automatique dans VSCODE? Comment résoudre le problème des contraintes de type de fonction générique de Golang en cours de suppression automatique dans VSCODE? Apr 02, 2025 pm 02:15 PM

La suppression automatique des contraintes de type de fonction générique Golang dans les utilisateurs de VScode peut rencontrer un problème étrange lors de l'écriture de code Golang à l'aide de VScode. quand...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

See all articles