当前位置: 首页 > 科技观察

程序员技术选择:写Go还是Java?

时间:2023-03-21 19:55:11 科技观察

本文作者结合自己的经验,详细比较了Go和Java的区别,给开发者有针对性的选择参考。老实说,我喜欢Java。在SpiralScout工作期间,我在使用EJB2、DB2和Oracle等后端技术进行软件开发方面获得了大量专业知识。在过去的几年里,我转向了基于自然语言处理的机器人项目,涉及的技术有SpringBoot、Redis、RabbitMQ、OpenNLP、IBMWatson和UIMA等。我选择的语言一直是Java,它非常高效,有时还很有趣。1.初识Go2017年初,接手了一个很有意思的项目,一个水培植物监控和种植的自动化编程系统。该项目的源代码包括一个使用CGo开发的网关,支持三种不同的系统(Windows、MacOS和ARM)。因为对Go不熟悉,边学习边用它实现功能。因为现有代码库的结构非常复杂,对我来说更是难上加难。一个用Go开发的程序,支持三种不同的操作系统,这意味着它需要针对三种不同的系统进行部署、测试和维护。此外,代码采用了单例设计模式,使得系统相互依赖严重,难以预测会出现什么问题,也难以理解。最后,我选择用Java实现新版本,结果也非常丑陋和混乱。加入SpiralScout后,我??试图停止使用Java。我决定拥抱Go,尽可能用Go开发。我发现它是一种创新且全面的语言,我们的团队仍然每天在各种项目中使用它。但是,与任何编程语言一样,Go也有其缺点,我不会撒谎——有时候我真的很怀念Java。如果说我的编程经验教会了我一件事,那就是——软件开发中没有灵丹妙药。在本文中,我将详细分享我使用传统语言和新语言的经验。2.简单性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的GC只有少数几个选项,用于设置初始垃圾收集目标百分比的GOGC变量。另一方面,Java有4种不同的垃圾收集器,每种都有大量的选项。尽管Java和Go都被认为是跨平台的,但Java需要Java虚拟机(JVM)来解释编译后的代码,而Go将代码编译为目标平台的二进制文件。但我认为Java的平台依赖性不如Go,因为Go每次都需要为新平台编译二进制文件。从测试和DevOps的角度来看,为不同平台单独编译二进制文件非常耗时,并且跨平台Go编译在某些情况下不起作用,尤其是在使用CGo时。而对于Java,您可以在安装JVM的任何地方使用相同的jar。Go需要更少的RAM,并且不需要安装和管理虚拟机。反射。Java的反射更方便,更流行,更常用,而Go的反射似乎更复杂。Java是一种面向对象的编程语言,所以除了原始类型之外的所有东西都被认为是一个对象。如果你想使用反射,你可以创建一个类,并从类中获取所需的信息,如下所示:这允许您访问构造函数、方法和属性,然后调用它们或为它们赋值。Go没有类的概念,结构只包含声明的字段。因此,我们需要使用“反射”包来获取我们需要的信息:typeFoostruct{Aint`tag1:"FirstTag"tag2:"SecondTag"`Bstring}f:=Foo{A:10,B:"Salutations"}fType:=reflect.TypeOf(f)switcht.Kind(fType)casereflect.Struct:fori:=0;i