Heim > Backend-Entwicklung > Golang > Verfügt die Go-Sprache über Anmerkungen?

Verfügt die Go-Sprache über Anmerkungen?

青灯夜游
Freigeben: 2023-01-28 09:04:53
Original
2201 Leute haben es durchsucht

Go-Sprache hat keine Anmerkungen. Die Gründe, warum die Go-Sprache keine Anmerkungen unterstützt: 1. Go bevorzugt einen klaren und expliziten Programmierstil im Design. 2. Im Vergleich zu vorhandenen Codemethoden bietet diese neue Methode des Dekorators nicht mehr als die vorhandenen Methoden genug, um die ursprüngliche Designidee zu verwerfen; 3. Es gibt sehr wenig Unterstützung durch die Stimmen in der Community.

Verfügt die Go-Sprache über Anmerkungen?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.

Das Besondere ist, dass Go über einige Funktionen verfügt, die andere Sprachen nicht haben. Das klassischste ist, dass N-Java-Studenten nach den Annotationen der Go-Sprache suchen und diese immer erklären müssen.

Zu diesem Zweck führt Sie Jianyu heute dazu, die Verwendung und Situation von Go-Sprachanmerkungen zu verstehen.

Was ist eine Anmerkung?

Den Verlauf verstehen

Wo ist die Anmerkung zum ersten Mal aufgetaucht? Es ist jedoch klar, dass Java-Annotationen bei der Verwendung von Annotationen am klassischsten sind. Um das Verständnis zu erleichtern, führen wir ein vorläufiges Verständnis von Annotationen durch, die auf Java basieren.

Verfügt die Go-Sprache über Anmerkungen?

Im Jahr 2002 schlug JSR-175 „A Metadata Facility for the Java Programming Language“ vor, das Metadaten-Tools für die Programmiersprache Java bereitstellen soll.

Dies ist die Quelle der heute am häufigsten verwendeten Anmerkung. Beispiele sind wie folgt:

// @annotation1// @annotation2func Hello() string {        return ""}
Nach dem Login kopieren

ist mit „@“ als Anmerkungszeichen formatiert.

Annotationsbeispiel

Auszug aus einem Annotationsbeispiel von @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 {  }
Nach dem Login kopieren

Im obigen Beispiel werden eine Reihe von Definitionen, Deklarationen, Zuweisungen usw. durch Annotationen erstellt. Wenn Sie mit den vorhandenen Anmerkungen der Sprache nicht vertraut sind oder komplexere Anmerkungen erstellen, fallen gewisse Verständniskosten an.

In der Branche wird oft gesagt, dass Anmerkungen „auf dem Quellcode kodieren“ Die Existenz von Anmerkungen hat klare Vor- und Nachteile. Was denken Sie?

Die Rolle von Annotationen

Die Funktionen von Annotationen sind in folgende Punkte unterteilt:

  • Informationen für den Compiler bereitstellen: Annotationen können vom Compiler verwendet werden, um Fehler zu erkennen oder Warnungen zu unterstützen.

  • Verarbeitung zur Kompilierungszeit und zur Bereitstellungszeit: Softwaretools können Anmerkungsinformationen verarbeiten, um Code, XML-Dateien usw. zu generieren.

  • Laufzeitverarbeitung: Einige Anmerkungen können zur Laufzeit überprüft und für andere Zwecke verwendet werden.

Wo sind die Go-Annotationen?

Aktuelle Situation

Die Go-Sprache selbst unterstützt keine leistungsstarken Annotationen, sondern ist auf die folgenden zwei Typen beschränkt:

  • Generierung zur Kompilierungszeit: go:generate
  • Einschränkungen bei der Kompilierungszeit: go:build

Aber das reicht nicht aus, um als Funktionsanmerkung verwendet zu werden, noch kann es ein Dekoratorverhalten wie Python bilden.

Warum nicht unterstützen

Jemand hat einen ähnlichen Vorschlag zu Go-Problemen gemacht,

Go-Mitarbeiter @ianlancetaylor gab eine klare Antwort: Go ist so konzipiert, dass es einen klaren und expliziten Programmierstil bevorzugt.

Die Vor- und Nachteile des Denkens sind wie folgt:

  • Vorteile: Ich weiß nicht, welche Vorteile Go durch das Hinzufügen von Dekoratoren haben kann, und ich konnte es in den Ausgaben nicht klar demonstrieren.
  • Nachteile: Es ist klar, dass es zu versehentlichen Einstellungen kommt.

Anmerkungen werden aus folgenden Gründen nicht akzeptiert:

  • Im Vergleich zu den vorhandenen Codemethoden bietet diese neue Dekoratormethode nicht mehr Vorteile als die vorhandenen Methoden und ist groß genug, um die ursprüngliche Designidee zunichte zu machen.
  • Innerhalb der Community gibt es nur sehr wenig Unterstützung für Abstimmungen (Abstimmung auf Basis von Emoticons) und es gibt nicht viel Feedback von Nutzern.

Einige Freunde sagen vielleicht, dass der Code viel einfacher ist, wenn Anmerkungen als Dekoratoren vorhanden sind.

Die Haltung des Go-Teams hierzu ist sehr klar.

Go glaubt, dass Lesbarkeit wichtiger ist Wenn Sie nur ein wenig mehr Code schreiben, ist dies nach Abwägung immer noch akzeptabel.

用 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}
Nach dem Login kopieren

对 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}"},                   ...                },            },        },    },}
Nach dem Login kopieren

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

模板生成

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

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

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

代码生成

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

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

//go:generate golangAnnotations -input-dir .
Nach dem Login kopieren

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

总结

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

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


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

Das obige ist der detaillierte Inhalt vonVerfügt die Go-Sprache über Anmerkungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage