返回顶部
首页 > 资讯 > 精选 >go语言有注解吗
  • 837
分享到

go语言有注解吗

2023-07-05 01:07:10 837人浏览 泡泡鱼
摘要

今天小编给大家分享一下Go语言有注解吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go语言没有注解。go语言不支持注解的原

今天小编给大家分享一下Go语言有注解吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

go语言没有注解。go语言不支持注解的原因:1、Go在设计上更倾向于明确的、显式的编程风格;2、对比现有代码方法,这种装饰器的新的方法没有提供比现有方法更多的优势,大到足矣推翻原有的设计思路;3、社区内的投票,支持的也很少。

什么是注解

了解历史

注解(Annotation)最早出现自何处,翻了一圈并没有找到。但可以明确,在注解的使用中,Java 注解最为经典,为了便于理解,因此我们基于 Java 做初步的注解理解。

go语言有注解吗

在 2002 年,jsR-175 提出了 《A Metadata Facility for the Java Programming Language》,也就是为 Java 编程语言提供元数据工具

这就是现在使用最广泛地注解(Annotation)的来源。示例如下:

// @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 语言本身并没有原生支持强大的注解,仅限于以下两种:

  • 编译时生成:go:generate

  • 编译时约束:go:build

但这先按不足以作为一个函数注解来使用,也无法形成像 python 那样的装饰器行为。

为什么不支持

Go issues 上有人提过类似的提案,

Go Contributor @ianlancetaylor 给出了明确的答复,Go 在设计上更倾向于明确的、显式的编程风格

思考的优缺点如下:

  • 优势:不知道 Go 能从添加装饰器中得到什么好处,没能在 issues 上明确论证。

  • 缺点:是明确的,会存在意外设置的情况。

因如下原因,没有接受注解:

  • 对比现有代码方法,这种装饰器的新的方法没有提供比现有方法更多的优势,大到足矣推翻原有的设计思路。

  • 社区内的投票,支持的也很少(基于表情符号的投票),用户反馈不多。

可能有小伙伴会说了,有注解做装饰器了,代码会简洁不少。

对此 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 原生都没支持,那么开源库都是如何实现的呢?在此我们借助 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 注解生成了。

以上就是“go语言有注解吗”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: go语言有注解吗

本文链接: https://lsjlt.com/news/348575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go语言有注解吗
    今天小编给大家分享一下go语言有注解吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go语言没有注解。go语言不支持注解的原...
    99+
    2023-07-05
  • go语言有while吗
    这篇“go语言有while吗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言有while吗”文章吧。go语言中没有wh...
    99+
    2023-07-04
  • go语言有gc吗
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。GC机制是在Java语言被广泛使用之后所火起来的,像后来的脚本语言Python都支持GC,GO也支持GC。Go语言和C/C++语言的一个显著的特点是Go中对象内存...
    99+
    2022-11-24
    Golang go语言 Go
  • go语言有反射吗
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。Go语言提供了一种机制在运行时更新和检查变量的值、调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射。反射也可以让我们...
    99+
    2022-11-25
    Go Golang go语言
  • go语言有缩进吗
    这篇文章主要介绍“go语言有缩进吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言有缩进吗”文章能帮助大家解决问题。go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofm...
    99+
    2023-07-04
  • go语言是易语言吗
    go语言不是易语言,两者是不同的编程语言。go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。易语言(EPL)是一门以中文作为程序代码编程语言,其以“易”著称,创始人为吴涛;易语言早...
    99+
    2023-05-14
    易语言 go语言 Golang
  • go语言有指针运算吗
    本篇内容介绍了“go语言有指针运算吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言没有指针运算。go语言的语法上是不支持指针运算的,...
    99+
    2023-07-04
  • go语言有垃圾回收吗
    go语言有垃圾回收。Go语言自带垃圾回收机制(GC);GC通过独立的进程执行,它会搜索不再使用的变量,并将其释放。在计算中。内存空间包含两个重要的区域:栈区 (Stack) 和堆区 (Heap);栈区一般存储了函数调用的参数、返回值以及局部...
    99+
    2023-05-14
    垃圾回收 Go Golang go语言
  • go语言缩进有影响吗
    go语言缩进对程序运行效率没有影响,但却对程序的可读性、可维护性和代码质量有着重要的影响。因此,在编写Go语言代码时,我们应该遵守Go语言的缩进规范,保持代码的一致性和可读性,以提高代码质量和开发效率 。本教程操作环境:windows10系...
    99+
    2023-07-14
  • go语言和js有关联吗
    go语言和js有关联。比较明显的关联有:1、Web开发;2、前后端分离;3、交互性;4、编译到JavaScript。本教程操作环境:windows10系统、golang1.20.1版本、DELL G3电脑。Go语言和JavaScript(简...
    99+
    2023-07-14
  • go语言是底层语言吗
    go语言不是底层语言,go语言被广泛认为是一种系统级编程语言,更接近于高级语言,而不是底层语言。底层语言通常是指与硬件直接交互的编程语言,它们提供了对计算机底层操作的精细控制,这些语言往往需要程序员手动管理内存、处理输入输出等底层细节,因此...
    99+
    2023-07-17
  • go语言是后端语言吗
    go语言是后端语言。go语言是服务端的编程语言,其方向主要是后端。使用Go语言做后端开发的原因:1、在语言层面具有语法简洁、执行效率高(底层语言)的特点;2、Go语言是主打并发、为并发而生的,其出发点即是瞄准大数据+云计算时代背景下的高并发...
    99+
    2023-05-14
    go语言
  • go语言是机器语言吗
    go语言不是机器语言;机器语言是低级语言,而go语言是一种高级语言。Go语言是Google公司在2009年开源的一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大;它的主要目标是“兼具 Py...
    99+
    2023-05-14
    go语言 Golang
  • go语言是动态语言吗
    go不是动态语言。go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其变量(variable)是有明确类型的,编译器也会检查变量类型的正确性;因此在使用变量之前必须声明数据类型需要,语法“var 变量...
    99+
    2023-05-14
    动态语言 go语言 Golang
  • go语言是静态语言吗
    go语言是静态语言。GO是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。静态语言(强类型语言)是编译时变量的数据类型就可以确定的语言;而在Go语言中,变量就是有明确类型的,编译器也会检查变量类型的正确性,声...
    99+
    2023-05-14
    Golang go语言
  • go语言是系统语言吗
    go语言是系统语言。Go语言是一门系统级语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大;它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安全性”。Go语言专门...
    99+
    2023-05-14
    Golang go语言
  • go语言是编程语言吗
    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型、并...
    99+
    2022-11-28
    Go Golang go语言
  • go语言有微服务框架吗
    go语言有微服务框架,例如:1、Istio,是一个开源的微服务管理、保护和监控框架;2、Go-kit,是一个Go语言的分布式开发包,用于开发微服务;3、Go-zero,是一个集成了各种工程实践的web和rpc框架;4、Go-micro,是一...
    99+
    2023-05-14
    微服务框架 go语言 Golang Go
  • go语言开源吗
    go语言是开源。go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现;go语言采用的是BSD开源协议。BSD开源协议是一个给于使用者很大自由的协议...
    99+
    2023-05-14
    Go Golang go语言
  • go语言属于底层语言吗
    go语言不属于底层语言。底层语言又叫低级语言,指实现效率低、执行效率高、对硬件的可控性强、目标代码小、可维护性差、可移植性差的语言。而go语言是一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能...
    99+
    2023-05-14
    Go go语言 Golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作