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 프로그래밍 언어용 메타데이터 도구를 제공하는 "Java 프로그래밍 언어용 메타데이터 기능"을 제안했습니다.
현재 가장 널리 사용되는 주석의 소스입니다. 예는 다음과 같습니다.
// @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 언어 자체는 강력한 주석을 기본적으로 지원하지 않으며 다음 두 가지 유형으로 제한됩니다.
그러나 이것은 함수 주석으로 사용하기에는 충분하지 않으며 Python과 같은 데코레이터 동작을 형성할 수도 없습니다.
누군가 Go 문제에 대해 비슷한 제안을 했습니다.
Go 기여자 @ianlancetaylor는 명확한 답변을 했습니다. Go는 명확하고 명시적인 프로그래밍 스타일을 선호하도록 설계되었습니다.
생각의 장단점은 다음과 같습니다.
다음과 같은 이유로 주석을 허용하지 않습니다.
어떤 친구들은 데코레이터로서 주석이 있으면 코드가 훨씬 간단해질 것이라고 말할 수도 있습니다.
이에 대한 Go 팀의 태도는 매우 분명합니다
Go는 가독성이 더 중요하다고 믿습니다. 코드를 조금만 더 작성해도 균형을 맞춰도 괜찮습니다.
虽然 Go 语言官方没有原生的完整支持,但开源社区中也有小伙伴已经放出了大招,借助各项周边工具和库来实现特定的函数注解功能。
GitHub 项目分别如下:
使用示例如下:
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 项目所提供的思路来讲解。
分为三个步骤:
解析代码。
模板处理。
生成代码。
首先,我们需要用用 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!