为Java开发者准备的Go教程01漫游了
原文链接:https://www.tuicool.com/articles/NnUZZ3b
在正式工作之前,一直使用 Java,虽然这些年对 Java 的关注变少了,但很显然,Java 用户群体特别大。不过,我也知晓,有不少人知道 Java 用户在学 Go。我尝试写一系列文章,为 Java 开发者讲解 Go 语言。
这是第一篇,从大的层面简单对比下 Go 和 Java,算作是一次漫游。
整体上,Java 和 Go 之间有许多明显而微妙的区别,包括语言层面和运行层面。我们这里主要在语言层面漫游。
这里的比较,没有贬低哪门语言的意思,旨在客观指出各自的特点。
Go 和 Java 都是 C 系语言,但 Go 更接近 C,包括风格、库等。 01 Go 是编译型语言,而 Java 是半解释的
与 C/C++ 一样,Go 语言源码会直接编译成目标计算机体系结构的机器语言。而 Java 源码编译成虚拟机语言,即字节码,并由 Java 虚拟机(JVM)进行解释(interpreted)。为了提高性能,字节码通常在运行时被动态编译成机器语言。JVM 本身是为特定的操作系统和硬件体系结构构建的。
而且 Go 是静态编译,一旦编译完成,Go 程序只需要一个操作系统就可以运行。Java 程序在运行之前需要计算机上安装有 JRE(特定版本)。许多 Java 程序可能还需要额外的第三方代码。
所以,虽然 Go 和 Java 都是跨平台的,但实现形式还是很不一样的。 02 Go 和 Java 程序结构类似
这两门语言都支持包含方法和字段的数据结构的概念。在 Go 中,它们被称为 struct(结构体),而在Java中,它们被称为 class(类)。这些结构被收集到称为包(package)的分组中。在这两门语言中,包都可以分层排列(即嵌套包)。
Java 包顶层只包含类型声明。Go 包括各种声明,如变量、常量、函数以及派生类型声明。
两门语言都通过导入(import)来访问不同包中的代码。在 Java 中,可以选择使用导入的类型(String 或 Java.lang.String)。在 Go 中,所有导入的名称必须始终是限定的(虽然可以本地导入,但不建议使用)。 03 Go 和 Java 代码风格的差异
这方面涉及到的内容不少,无法一一列出。这里提一些:
1)Go 与众不同,变量声明,类型放在后面。语言通常省略分号。
Java:int x, y, z;
Go:var x, y, z int
2)Java 方法只能返回一个值。Go 函数/方法可以返回许多值。
3)Java 方法和字段必须在它们所属的类型内声明。Go 方法是在所属类型之外定义的。Go 支持独立于任何类型的函数和变量。Java 没有真正的静态共享变量;静态字段只是某些类(相对于实例)的字段。Go 支持在可执行映像中分配的真正静态(全局)变量。
4)Java 只允许其他类型(类、枚举和接口)的类型扩展,而 Go 可以基于任何现有类型创建新类型,包括基本类型(如整数和浮点)和其他用户定义的类型。Go 可以支持这些自定义类型中的任何一种。
5)Go 和 Java 接口的工作方式非常不同。在 Java 中,类(或枚举)实现接口时,必须显式指定。在 Go 中,任何类型都可以通过实现接口的方法来实现接口,即隐式实现接口,所谓的鸭子类型。
6)Java 通过 try/catch 处理异常。Go 中是 error,另外有 panic 和 recover。 04 Java 是面向对象语言,而 Go 不完全是
面向对象的三大特性:封装、继承和多态。
Go 没有继承的概念,认为组合优于继承。不过,在 Go 中,可以通过内嵌来模仿部分类似继承的功能,但本质还是组合。
此外,Go 只在接口层面有多态,没有方法重载。 05 Java 不少特性是基于 Annotation 的,Go 没有 Annotation
许多 Java 库(特别是框架,比如Spring),都充分利用了 Java 的注解(Annotation)。注解提供元数据(通常在运行时使用),以修改库提供的行为。Go 没有注解,因此缺少此功能。Go 可以使用代码生成(go generate)获得与注释类似的结果。Go 有一种简单的注解形式,称为 tag,可用于自定义某些库行为,如 JSON 或 XML 格式。 06 Go 和 Java 都使用 GC 管理内存
这两门语言都使用 stack 和 heap 来保存数据。栈主要用于函数局部变量,堆用于其他动态创建的数据。在 Java 中,所有对象都在堆上分配。在 Go 中,堆上只分配可在函数生命周期之外使用的数据(通过逃逸分析确认)。在 Java 和 Go 中,堆都是垃圾收集的;堆对象由代码显式分配,但总是由垃圾收集器回收。
Java 没有指向对象的指针的概念,只引用位于堆中的对象。Go 允许访问指向任何数据值的指针(或地址)。在大多数情况下,Go 的指针可以像 Java 引用一样使用。
Go 的垃圾收集实现比 Java 的更简单,通常 Go GC 需要调优的情况较少(没有太多选项可配置)。 07 Go 和 Java 都支持并发,但方式不同
Java 有线程(Thread)的概念。而 Go 是 Goroutine,它是由语言提供的。Goroutine 通常被称为轻量级线程。Go 运行时支持使用比 JRE 支持的线程多得多的 Goroutine。
Java 支持同步控制。Go 具有类似的库函数。Go 和 Java 都支持跨 Thread/Goroutine 安全更新的原子值的概念。两者都支持显式锁定库。
Go 提供了通信顺序进程(CSP)的概念,作为 Goroutine 在没有显式同步和锁定的情况下进行交互的主要方式。Goroutine 通过 channel 进行通信,channel 是有效的管道(FIFO 队列),通常与 select 语句相结合使用。 08 Go 运行时比 JRE 更简单
Go 的运行时比 JRE 提供的运行时小得多。没有 JVM 等价物,但两者中都存在类似的组件,如垃圾收集。Go 没有字节码解释器。
Go 拥有大量的标准库。Go 社区提供了更多库。但是 Java 标准库和社区库在功能的广度和深度上都远远超过了当前的 Go 库(毕竟 Java 比 Go 早太多年了,而且生态确实好)。尽管如此,Go 库仍然足够丰富,可以开发许多有用的应用程序,特别是服务端程序。
所有使用过的库都会嵌入到 Go 可执行文件中,即前面提到的静态编译。可执行文件是运行程序所需的一切(而 Java 库在首次使用时动态加载)。这使得 Go 程序二进制文件通常比 Java 二进制文件(单个 "main" 类)大,但当加载 JVM 和所有依赖类时,Java 的总内存占用通常更大。 09 Go 程序的构建过程是不同的
Java程序是在运行时构造的类的合并,通常来自多个源(供应商)。这使得Java程序非常灵活,特别是当通过网络下载时。Go 程序是在执行之前静态构建的。启动时,可执行映像中的所有代码都可用。这提供了更大的完整性和可预测性,部署特别方便,但牺牲了一些灵活性。这使得 Go 更适合集装箱化部署。
Go 程序通常由 "go builder" 构建,这是一种结合了编译器、依赖项管理器、链接器和可执行构建器等的工具。它包含在标准 Go 安装中。Java 类被单独编译(由 Java 开发工具包(JDK)提供的 javac 工具编译),然后通常被组装成包含相关类的归档文件(JAR/WAR)。程序是从一个或多个存档中加载的。档案的创建,特别是包括任何依赖项,通常由独立于标准 JRE 的程序(如 Maven)完成。
其他方面,比如 Java 和 Go 都是过程式语言,此外,在函数式编程方面,Go 一开始,函数就是一等公民,而 Java 8 才有较好的支持。
最新消息郑州3号线二期工程轨道安装开始招标了郑州市轨道交通3号线二期工程轨道安装招标公告1。招标条件郑州市轨道交通3号线二期工程轨道安装,已由豫发改基础2019819号文批准建设,招标人为郑州地铁集团有限公司,建设资金来自政
应该在知足中过好你的每一天人生,总是在经历过后才懂得,失去以后才珍惜,错过之后才懊悔,对比之后才明白。曾经车水马龙,人群熙熙攘攘,摩肩擦踵之间,只觉一切是寻常。仿佛生活就该如此模样,以为岁月就会一直如此静好
方言,请别离我们而去十里不同音,百里不同俗,在过去人挑肩扛的年代里,信息和交通都不发达,我们的小山村相对比较封闭,人们在长期的生产生活中,就逐渐形成了自己独特的文化。在亘古绵长的岁月里,这种文化自然地
这样回你微信的人,最值得你深爱人生最幸运的事情之一,就是遇到一个值得深爱的人,即便你们最后没有在一起,当你回想起这个人的时候,你心里更多的是幸福和惋惜。幸福源于曾经的回忆,惋惜这样一个人,没能陪你走到最后。其实
电子商务对物流的影响近几年来,随着电子商务环境的改善以及电子商务所具备的巨大优势,电子商务受到了政府企业界的高度重视,纷纷以不同的形式介人电子商务活动中,使电子商务在短短的几年中以惊人的速度在发展。在
科技加码,实力俱增纽恩泰商用变频热水新品发布数据显示,2021年上半年,商用热泵热水市场规模为8。68亿元,同比增长37。7。由于弥补了去年同期工程项目停滞带来的空缺,商用热泵热水产品的增长领先于其他产品。可以预见,商用热泵
当风轻借力,一举入高空,纽恩泰3000终极实训中心刮起工匠之风宝剑锋从磨砺出,更强调安装技艺的空气源热泵两联供系统,将三分产品,七分安装的积极意义进一步凸显。在消费升级的时代窗口下,如何保障用户的舒适生活,正成为暖通行业的重要课题,走在市场发
万名暖通技工实训班第二期落幕,纽恩泰持续塑行业工匠精神纽恩泰作为空气能行业领军品牌,致力于推进两联供市场健康发展,为培养暖通人才,以匠心成就精品工程,在3月末举行的万名暖通技工实训班第一期的圆满落幕可谓是做了漂亮的开门红,接踵而至的4
顺势而为聚势而上,纽恩泰以实际行动助推两联供行业发展最近几年,两联供机组始终保持高速增长的态势。根据艾肯网统计,2021上半年,两联供机组的整体市场容量约为14亿元,历史上首次半年度总量超过10亿元,同比2020上半年增长55。6,
如何打造城镇集中供暖新天地?河北赵县给你答案蓝天保卫战的阶段性胜利,再一次证明了空气源热泵用于北方清洁采暖改造的积极意义。建立在北方户式采暖改造成功经验的基础上,面对如今规模更大,范围更广的城镇集中式供暖区域,空气源热泵产品
纽恩泰连续三年荣获广东省守合同重信用企业称号人无信不立,业无信不兴,守合同重信用是企业可持续发展的基石,也是对客户最好的承诺。只有以客户为中心,以诚信为根本,专注为客户创造价值,持续追求客户满意,企业才能长盛不衰,永远立于不