Jadual Kandungan
Apakah anotasi
Fahami sejarah
Contoh anotasi
Peranan anotasi
Di manakah anotasi Go
Situasi semasa
Mengapa tidak menyokong
用 Go 实现注解
解析 AST
模板生成
代码生成
总结
Rumah pembangunan bahagian belakang Golang Adakah bahasa go mempunyai anotasi?

Adakah bahasa go mempunyai anotasi?

Jan 18, 2023 pm 04:51 PM
golang pergi bahasa

Bahasa Go tidak mempunyai anotasi. Sebab mengapa bahasa go tidak menyokong anotasi: 1. Go lebih suka gaya pengaturcaraan yang jelas dan eksplisit dalam reka bentuk 2. Berbanding dengan kaedah kod sedia ada, kaedah penghias baharu ini tidak memberikan lebih daripada kaedah sedia ada cukup untuk membatalkan idea reka bentuk asal 3. Terdapat sangat sedikit sokongan daripada undian dalam komuniti.

Adakah bahasa go mempunyai anotasi?

Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.

Istimewanya ialah Go mempunyai beberapa ciri yang tidak ada pada bahasa lain. Yang paling klasik ialah pelajar N Java sedang mencari di mana anotasi bahasa Go berada dan mereka sentiasa perlu menjelaskan.

Untuk tujuan ini, hari ini Jianyu akan membawa anda memahami penggunaan dan situasi anotasi bahasa Go.

Apakah anotasi

Fahami sejarah

Di manakah Anotasi mula-mula muncul? Tetapi jelas bahawa dalam penggunaan anotasi, anotasi Java adalah yang paling klasik Untuk memudahkan pemahaman, kami melakukan pemahaman awal tentang anotasi berdasarkan Java.

Adakah bahasa go mempunyai anotasi?

Pada tahun 2002, JSR-175 mencadangkan "Kemudahan Metadata untuk Bahasa Pengaturcaraan Java", iaitu untuk menyediakan alat metadata untuk bahasa pengaturcaraan Java.

Ini ialah sumber anotasi yang paling banyak digunakan hari ini. Contohnya adalah seperti berikut:

// @annotation1// @annotation2func Hello() string {        return ""}
Salin selepas log masuk

semuanya diformatkan dengan “@” sebagai tanda anotasi.

Contoh anotasi

Dipetik daripada contoh anotasi oleh @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 {  }
Salin selepas log masuk

Dalam contoh di atas, satu siri anotasi dilakukan melalui anotasi Definisi, pengisytiharan, tugasan, dsb. Jika anda tidak biasa dengan anotasi bahasa yang sedia ada, atau jika anda membuat anotasi yang lebih kompleks, akan ada kos pemahaman tertentu.

Adalah sering dikatakan dalam industri bahawa anotasi ialah "pengekodan pada kod sumber" Kewujudan anotasi mempunyai kelebihan dan kekurangan yang jelas. Apa pendapat anda?

Peranan anotasi

Peranan anotasi dibahagikan kepada perkara berikut:

  • menyediakan pengkompil dengan Maklumat : Anotasi boleh digunakan oleh pengkompil untuk mengesan ralat atau amaran sokongan.

  • Pemprosesan masa kompilasi dan masa penggunaan: Alat perisian boleh memproses maklumat anotasi untuk menjana kod, fail XML, dsb.

  • Pemprosesan masa jalan: Sesetengah anotasi boleh disemak semasa masa jalan dan digunakan untuk tujuan lain.

Di manakah anotasi Go

Situasi semasa

Bahasa Go itu sendiri tidak asli sokongan Anotasi berkuasa terhad kepada dua jenis berikut:

  • Penjanaan masa kompilasi: go:generate
  • Kekangan masa kompilasi: go:build

Tetapi tekan dahulu Ia tidak mencukupi untuk digunakan sebagai anotasi fungsi, dan ia juga tidak boleh membentuk tingkah laku penghias seperti Python.

Mengapa tidak menyokong

Seseorang membangkitkan cadangan yang sama tentang isu Go,

Penyumbang Go @ianlancetaylor memberikan jawapan yang jelas, Go is direka bentuk untuk memihak kepada gaya pengaturcaraan yang jelas dan eksplisit.

Kebaikan dan keburukan pemikiran adalah seperti berikut:

  • Kelebihan: Saya tidak tahu apa faedah yang boleh Go dapat daripada menambah penghias, dan saya tidak dapat melakukannya dengan jelas menunjukkannya dalam isu.
  • Kelemahan: Jelas bahawa akan ada tetapan yang tidak disengajakan.

Anotasi tidak diterima atas sebab-sebab berikut:

  • Berbanding dengan kaedah kod sedia ada, kaedah penghias baharu ini tidak memberikan lebih banyak kelebihan daripada kaedah sedia ada , cukup besar untuk membatalkan idea reka bentuk asal.
  • Terdapat sedikit sokongan untuk undian dalam komuniti (pengundian berdasarkan emotikon), dan tiada banyak maklum balas daripada pengguna.

Sesetengah rakan mungkin mengatakan bahawa jika terdapat anotasi sebagai penghias, kod itu akan menjadi lebih mudah.

Sikap pasukan Go mengenai perkara ini sangat jelas

Go percaya bahawa kebolehbacaan adalah lebih penting Jika anda hanya menulis lebih sedikit kod, ia masih boleh diterima selepas menimbang baki.

用 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}
Salin selepas log masuk

对 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}"},                   ...                },            },        },    },}
Salin selepas log masuk

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

模板生成

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

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

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

代码生成

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

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

//go:generate golangAnnotations -input-dir .
Salin selepas log masuk

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

总结

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

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


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

Atas ialah kandungan terperinci Adakah bahasa go mempunyai anotasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Apr 02, 2025 pm 02:03 PM

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau disediakan oleh projek sumber terbuka yang terkenal? Perpustakaan mana yang dibangunkan oleh syarikat besar atau disediakan oleh projek sumber terbuka yang terkenal? Apr 02, 2025 pm 04:12 PM

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Apakah perbezaan antara struktur definisi kata kunci `var` dan` type` dalam bahasa Go? Apakah perbezaan antara struktur definisi kata kunci `var` dan` type` dalam bahasa Go? Apr 02, 2025 pm 12:57 PM

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Apr 02, 2025 pm 04:54 PM

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apr 02, 2025 pm 05:09 PM

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Bagaimana untuk menyelesaikan masalah kekangan jenis fungsi generik Golang yang dipadamkan secara automatik dalam vscode? Bagaimana untuk menyelesaikan masalah kekangan jenis fungsi generik Golang yang dipadamkan secara automatik dalam vscode? Apr 02, 2025 pm 02:15 PM

Penghapusan automatik Golang Generik Jenis Kekangan Jenis dalam Pengguna VSCode mungkin menghadapi masalah yang aneh ketika menulis kod Golang menggunakan vscode. Bila ...

See all articles