iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Go语言的优点有哪些
  • 563
分享到

Go语言的优点有哪些

2024-04-02 19:04:59 563人浏览 八月长安
摘要

本篇内容主要讲解“Go语言的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言的优点有哪些”吧!简洁性Go 和 Java 都是 C 家族语言,所以

本篇内容主要讲解“Go语言的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言的优点有哪些”吧!

简洁性

Go 和 Java 都是 C 家族语言,所以它们具有相似的语法。因此,Java 开发人员可以很容易读懂 Go 代码,反之亦然。Go 不需要在语句末尾使用分号(';'),只有少数情况例外。对我来说,Go 的行分隔方式更清晰,更易读。

Go 和 Java 都使用了我最喜欢的功能之一,即垃圾收集器(GC),用来帮助防止内存泄漏。与 c++ 不同,C 家族的程序员需要处理内存泄漏问题。垃圾回收器是自动化内存管理的一个特性,减轻了程序员的负担。

Go 的 GC 并未使用“弱世代假设”,但它的表现仍然非常出色,并且 STW(Stop-the-World)的时间非常短。在 1.5 版中,STW 降得更多,并且很稳定,而在 1.8 版中,它降到了 1 毫秒以下。

Go语言的优点有哪些

Go 的 GC 只有少量的一些选项,即用于设置初始垃圾回收目标百分比的 GOGC 变量。而 Java 有 4 个不同的垃圾回收器,每个垃圾回收器都有大量的选项。

尽管 Java 和 Go 都被认为是跨平台的,但 Java 需要 Java 虚拟机JVM)来解释编译后的代码,而 Go 是将代码编译成目标平台的二进制文件。但我认为,与 Go 相比,Java 对平台的依赖程度更低,因为 Go 每次都需要为新平台编译二进制文件。从测试devops 的角度来看,分别为不同的平台编译二进制文件非常耗时,并且跨平台的 Go 编译在某些情况下不起作用,尤其是在使用 CGo 时。而对于 Java,你可以在安装了 JVM 的任何地方使用相同的 jar。Go 需要的 RAM 更小一些,并且不需要安装和管理虚拟机。

反射。Java 的反射更方便、更流行也更常用,而 Go 的反射似乎更复杂。Java 是一种面向对象编程语言,因此除原始类型之外的所有东西都被视为对象。如果要使用反射,可以创建一个类,并从类中获取所需的信息,如下所示:

Class cls = obj.getClass();  Constructor constructor = cls.getConstructor();  Method[] methods = cls.getDeclaredFields();

这样就可以访问构造函数、方法和属性,然后调用或对它们赋值。

Go 没有类的概念,并且结构体只包含了已声明的字段。因此,我们需要借助“reflection”包来获得所需的信息:

type Foo struct {  A int `tag1:"First Tag"  tag2:"Second Tag"`  B string  }    f := Foo{A: 10, B: "Salutations"}  fType := reflect.TypeOf(f)  switch t.Kind(fType)  case reflect.Struct:  for i := 0; i < t.NumField(); i++ {  f := t.Field(i)  // ...  }  }

我觉得这不是一个大问题,但由于 Go 中没有结构体的构造函数,所以很多原始类型必须单独处理,并且需要考虑到指针。在 Go 中,我们可以进行指针传递或值传递。Go 的结构体可以将函数作为字段。所有这些都让 Go 的反射变得更加复杂。

可访问性。Java 有 private、protected 和 public 修饰符,为数据、方法和对象提供了不同的访问作用域。Go 有与 Java 的 public 和 private 相似的 exported/unexported,但没有修饰符。以大写字母开头的所有内容都将被导出,对其他包可见,未导出(小写)的变量或函数仅在当前包中可见。

Go 与 Java 的大不同

Go 不是面向对象编程语言。Go 没有类似 Java 的继承机制,因为它没有通过继承实现传统的多态性。实际上,它没有对象,只有结构体。它可以通过接口和让结构体实现接口来模拟一些面向对象特性。此外,你可以在结构体中嵌入结构体,但内部结构体无法访问外部结构体的数据和方法。Go 使用组合而不是继承将一些行为和数据组合在一起。

Go 是一种命令式语言,Java 是一种声明式语言。Go 没有依赖注入,我们需要显式地将所有东西包装在一起。因此,在使用 Go 时尽量少用“魔法”之类的东西。一切代码对于代码评审人员来说都应该是显而易见的。Go 程序员应该了解 Go 代码如何使用内存、文件系统和其他资源。

Java 要求开发人员更多地地关注程序的业务逻辑,知道如何创建、过滤、修改和存储数据。系统底层和数据库方面的东西都是通过配置和注解来完成的(比如通过 Spring Boot 等通用框架)。我们尽可能把枯燥乏味的东西留给框架去做。这样做很方便,但控制也反转了,限制了我们优化整个过程的能力。

变量定义的顺序。在 Java 中,你可以这样定义变量:

String name;

而在 Go 中,你得这么写:

name string

在我刚开始使用 Go 时,这也是令我感到困惑的一个地方。

 Go 好的方面

优雅的并发。Go 具有强大的并发模型,叫作“通信顺序进程”或 CSP。Go 使用 n-to-m 分析器,允许在 n 个系统线程中执行 m 个并发。启动并发例程非常简单,只需使用 Go 的一个关键字即可,例如:

go doMyWork()

这样就可以并发执行 doMyWork()。

进程之间的通信可以通过共享内存(不推荐)和通道来完成。我们可以使用与环境变量 GOMAXPROCS 定义的进程数一样多的核心,并带来非常健壮和流畅的并行性。默认情况下,进程数等于核心数。

Go 提供了一种特殊模式来运行二进制文件,并可以检测执行竟态条件。我们可以通过这种方式测试并证明自己的程序是不是并发安全的。

go run -race myapp.go

应用程序将在竟态检测模式下运行。

Go 提供了很多开箱即用且非常有用的基本功能,例如用于并发的“sync”包。“Once”类型的单例可以这么写:

package singleton  import ("sync")  type singleton struct { }  var instance *singleton  var once sync.Once  func GetInstance() *singleton {  once.Do(func() {  instance = &singleton{}  })  return instance  }

sync 包还为并发 map 实现、互斥、条件变量和 WaitGroup 提供了一种结构体。atomic 包支持并发安全转换和数学运算&mdash;&mdash;它们基本上是编写并发代码所需的一切。

指针。借助指针,Go 可以更好地控制如何分配内存、垃圾回收器负载以及其他在 Java 中无法实现的性能调优。与 Java 相比,Go 更像是一种低级的语言,并且支持更容易、更快的性能优化

鸭子类型(Duck Typing)。“如果它走路像鸭子,并且像鸭子一样嘎嘎叫,那它一定就是鸭子”。在 Go 中就是这样的:无需定义某种结构体是否实现了给定的接口,只要这个结构体具有与给定接口相同的方法签名,那它就是实现了这个接口。这非常有用,作为代码库的调用端,你可以定义外部库结构体所需的任意接口。而在 Java 中,对象必须显式声明实现了哪些接口。

性能分析器。Go 的性能分析工具让性能问题分析变得便捷和轻松。Go 的分析器可以揭示程序的内存分配和 CPU 使用情况,并在可视化图形中展示出来,让性能优化变得非常容易。Java 也有很性能分析器,比如 Java VisualVM,但它们都比 Go 的复杂,而且依赖 JVM 的运行情况,因此它们提供的统计信息与垃圾回收器的运行相关。

CGO。Go 可以与 C 语言集成,因此你可以在 Go 项目中开发带有 C 代码片段的应用程序。开发人员可以使用 CGo 创建调用 C 代码的 Go 程序包。Go 为 exclude/include 给定平台的 C 代码片段提供了各种构建选项。

将函数作为参数。Go 函数可以作为变量传递给另一个函数或作为结构体的字段。这种多功能性令人耳目一新。Java 8 引入了 lambda,但它们不是真正的函数,只是单函数对象。

清晰的代码风格准则。Go 社区提供了很多示例和说明:

https://golang.org/doc/effective_go.html

函数可以返回多个参数,这个也非常有用。

package main  import "fmt"  func returnMany() (int, string, error) {  return 1, "example", nil  }  func main() {  i, s, err := returnMany()  fmt.Printf("Returned %s %s %v", i, s, err)  }

5. Go 不好的方面

没有多态性(除非通过接口来实现)。在 Go 中,如果在同一个包中有两个函数具有不同的参数但含义相同,必须给它们指定不同的名字。例如这段代码:

func makeWorkInt(number int) {  fmt.Printf(“Work done number %d”, number)  }  func makeWorkStr(title string) {  fmt.Printf(“Work done title %s”, title)  }

这样一来,你就会得到很多方法,它们做的事情差不多,但名字都不一样,而且看起来很“丑”。

另外,Go 也没有继承多态性。被嵌入到结构体里的结构体只知道其自己的方法,对“宿主”结构体的方法一无所知。对于像我这样的开发人员来说,这尤其具有挑战性,因为我们是从其他 OOP 语言(最基本的概念之一就是继承)过渡到 Go 的。

不过,随着时间的推移,我开始意识到这种处理多态性的方法只是另一种思维方式,而且是有道理的,因为组合比继承更加可靠,并且运行时间是可变的。

错误处理。在 Go 中,完全由你来决定返回什么错误以及如何返回错误,因此作为开发人员,你需要负责返回和传递错误。毫无疑问的是,错误可能会被隐藏掉,这是一个痛点。时刻要记得检查错误并把它们传递出去,这有点烦人,而且不安全。

当然,你可以使用 linter 来检查隐藏的错误,但这只是一种辅助手段,不是真正的解决方案。在 Java 中,处理异常要方便得多。如果是 RuntimeException,甚至不必将其添加到函数的签名中。

public void causeNullPointerException() {  throw new NullPointerException("demo");  }    try {  causeNullPointerException();  } catch(NullPointerException e) {  System.out.println("Caught inside fun().");  throw e; // rethrowing the exception  }

没有泛型。虽然泛型很方便,但它会增加复杂性,而且从类型系统和运行时方面来看,泛型的成本很高。在构建 Go 代码时,你需要处理各种不同的类型或使用代码生成。

没有注解。尽管可以用代码生成替换一部分编译时注解,但运行时注解是不能替换的。这是有道理的,因为 Go 不是声明式的,并且代码里不应该包含任何“魔法”。我喜欢在 Java 中使用注解,因为它们让代码更优雅、简单和简约。

在为 Http 服务器端点生成 swagger 文件时,注解会非常有用。目前在 Go 中需要手动编写 swagger 文件,或者为端点提供特别的注释。每次 api 发生改动时,这都是一件很痛苦的事情。但是,Java 中的注解就像是一种魔法一样,人们通常都不用去关心它们是怎么实现的。

Go 的依赖管理。我之前曾写过一篇关于如何使用 vgo 和 dep 在 Go 中进行依赖管理的文章。Go 的依赖管理的演变之路充满了坎坷。最初,除了“ Gopgk”之外没有其他依赖管理工具,后来发布了实验性的“Vendor”,后被“vgo”取代,然后又被 1.10 版“go mod”取代。如今,我们可以手动或者使用各种 Go 命令(例如“go get”)来修改 go.mod 文件描述符,但这也让依赖关系变得不稳定。

Java 有 Maven 和 Gradle 之类的声明式工具,用来进行依赖关系管理,也用于构建、部署和处理其他 CD/CI 任务。但是,在 Go 中,我们必须使用 Makefile、Docker-composes 和 bash 脚本自定义构建所需的依赖管理,这只会使 CD/CI 的过程和稳定性变得更加复杂。

包的名称里包括了托管域名。例如:

import "GitHub.com/pkg/errors"

这真的很奇怪,而且很不方便,因为你不能在不修改项目代码库导入的情况下用自己的实现替换别人的实现。

在 Java 中,导入通常以公司名称开头,例如:

import by.spirascout.public.examples.simple.Helper;

区别在于,在 Go 中,go get 会向 by.spirascout.public 获取资源。在 Java 中,包名和域名不一定是相关联的。

我希望所有与依赖管理有关的问题都是暂时的,将来会得到妥善的解决。

到此,相信大家对“Go语言的优点有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Go语言的优点有哪些

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言的优点有哪些
    本篇内容主要讲解“Go语言的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言的优点有哪些”吧!简洁性Go 和 Java 都是 C 家族语言,所以...
    99+
    2024-04-02
  • go语言有哪些优点
    go语言的优点有:1、简洁易学,具有清晰简洁的语法和规范,减少了代码的复杂性;2、并发编程,内置了强大的并发编程功能,使得编写高效且可扩展的并发程序变得容易;3、高效性能,在编译代码时能够生成高度优化的机器码;4、跨平台支持,可以在不同的操...
    99+
    2023-07-31
  • Go语言的使用优点有哪些
    这篇“Go语言的使用优点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言的使用优点有哪些”文章吧。Map 集合/...
    99+
    2023-06-16
  • 使用Go语言的优点有哪些
    本篇内容介绍了“使用Go语言的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Go语言的优势强悍并发性能(Go内置Goroutine...
    99+
    2023-06-15
  • Go语言的特点和优势有哪些?
    Go语言的特点和优势有哪些? Go语言是一种由Google开发的编程语言,它以其简洁、快速、并发性强等特点而备受开发者的青睐。在本文中,我们将详细探讨Go语言的特点和优势,并附上一些具...
    99+
    2024-03-13
    并发 特点: 静态 强类型 优势: 性能高 go语言
  • Go语言的优势及缺点有哪些
    这篇文章主要讲解了“Go语言的优势及缺点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言的优势及缺点有哪些”吧!Go的优势 原因 1:性能 ...
    99+
    2024-04-02
  • Go语言的特点有哪些
    这篇文章主要讲解了“Go语言的特点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言的特点有哪些”吧!一些特点Go是静态类型的。 所有变量都需要使用给定类型声明。 bool,str...
    99+
    2023-06-16
  • go语言有哪些缺点
    go语言的缺点有:1、标准库方面相对较小,其中并不包含很多常见的功能;2、错误处理机制相对较为繁琐,可能会导致代码的可读性和可维护性降低,并且容易忽略错误处理的情况;3、包管理器相对较弱,处理依赖版本冲突和依赖管理方面的灵活性相对较低;4、...
    99+
    2023-07-31
  • go语言有哪些优势
    go语言的优势有高效编译、并发处理能力强、内存管理优秀、类型安全、丰富的标准库、跨平台支持、简单易学、静态链接和可执行文件生成、内置的包管理工具以及多核支持等。详细介绍:1、高效编译,Go语言的编译速度非常快,可以快速生成可执行文件;2、并...
    99+
    2023-12-11
    go语言
  • Python语言有哪些优点
    这篇文章主要讲解了“Python语言有哪些优点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python语言有哪些优点”吧!Python语言是一门解释性的、面向对象的、动态语义特征的高层语言...
    99+
    2023-06-17
  • Go语言的编写语言有哪些特点?
    Go语言是一种由Google开发的开源编程语言,于2009年正式发布。它被设计成一种简单、高效、可靠的语言,具有许多独特的特点。在本文中,我们将详细介绍Go语言的编写语言特点,并提供一...
    99+
    2024-04-02
  • go语言具有哪些优势
    go语言具有性能优越、并发能力强、静态类型、丰富的标准库、跨平台、简洁易读、并发安全、内存管理、高效编译、支持网络和Web开发等优势。详细介绍:1、性能优越:Go语言是编译型语言,相较于解释型语言,如Python,其运行速度更快,性能更优;...
    99+
    2023-12-11
    go语言 优势
  • R语言的优点和缺点有哪些
    本篇内容介绍了“R语言的优点和缺点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! R语言拥有强大的软件包生态系统与图表优势R语言的优势...
    99+
    2023-06-17
  • php语言优缺点有哪些
    小编给大家分享一下php语言优缺点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发...
    99+
    2023-06-14
  • kotlin语言有哪些优点和缺点
    Kotlin语言的优点和缺点如下: 优点: 简洁:Kotlin语言相较于Java语言更加简洁,减少了很多冗余的代码,提升了开发效率...
    99+
    2023-10-25
    kotlin
  • dart语言有哪些优点和缺点
    优点:1. 快速开发:Dart语言内置了许多现代语言的特性,如异步编程和代码重用等,使得开发速度更快。2. 高性能:Dart语言的J...
    99+
    2023-06-13
    dart语言
  • Go语言的日志系统有哪些特点和优势?
    日志系统是现代软件开发中必不可少的一部分。它不仅可以帮助开发人员调试程序,还可以记录应用程序的运行状态和行为。在Go语言中,标准库提供了log包,可以方便地记录日志。除此之外,还有一些第三方库也可以用于日志记录,例如zap和logrus等...
    99+
    2023-07-27
    同步 并发 日志
  • 易语言编程的优点有哪些
    本篇内容介绍了“易语言编程的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最早接触易语言是三年前的事情了,那时候是因为DNF这个游...
    99+
    2023-06-25
  • go语言有哪些优势劣势
    go语言的优势:1、简洁、高效、安全;2、并发处理能力强;3、静态类型和编译型;4、丰富的标准库;5、跨平台和可移植性;6、强大的性能;7、原生支持多范式编程;8、垃圾回收机制;9、强大的并发模型。go语言的劣势:1、语法相对较新;2、生态...
    99+
    2023-12-11
    go语言 优势劣势
  • Java编程语言有哪些优点
    这篇文章主要介绍“Java编程语言有哪些优点”,在日常操作中,相信很多人在Java编程语言有哪些优点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java编程语言有哪些优点”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作