golang和java开发选哪个?为什么?
原创

golang和java开发选哪个?为什么?

好文

热门回答:

我有朋友是资深程序员。目前现在依据他的兴趣循序渐进地学习Go。而他过去十年一直在利用Java做开发。再往前他是利用C ++。

过去他会利用Java为银行和医疗领域做开发。即便站在今天的时间点上。仍旧可以相信java仍旧是首选安全、成熟的技术。

Java的强项是有像Spring这样成熟的框架。如果有人要解决业务问题。尤其是那些适合OO数据模型的业务问题。用java是很容易实现的。

我了解的目前在使用Go的团队。基本是在搞大数据项目。

我们认为。Go会是java(因为在国内太主流了)的一个备选方案。譬如当你发现你希望某个项目/产品非常有挑战。有可能是有技术创新和突破的那类。并且发现Java的优势在这样的项目中不怎么突出。那Go一定是不错的选择。

Go与Java:相似之处

1、Go和Java都是C族语言。这意味着它们共享相似的语言语法。因此。Java开发人员经常发现阅读Go代码相当容易。反之亦然。Go在语句的末尾不使用分号(';')。但在少数情况下除外。对我来说。Go的行分隔语句更加清晰易读。

2、Go和Java都使用了我最喜欢的功能之一。即垃圾收集器(GC)。以帮助防止内存泄漏。与C ++不同。C系列程序员必须担心内存泄漏。垃圾回收器是使内存管理自动化并因此简化工作的功能之一。Go的GC仅GOGC变量可设置初始垃圾回收目标百分比。在Java中。有4个不同的垃圾收集器。每个垃圾收集器都有大量的设置。

3、Java和Go都被认为是跨平台的。但是Java需要Java虚拟机(JVM)来解释编译后的代码。Go可以简单地将代码编译为任何二进制文件。实际上。我认为Java与Go相比。Java的依赖程度更低。因为Go每次为一个平台编译代码时都需要您创建一个二进制文件。从测试和DevOps的角度来看。分别编译不同平台的二进制文件非常耗时。并且跨平台的Go编译在某些情况下不起作用。尤其是当我们使用CGo部件时。同时。使用Java。您可以在拥有JVM的任何地方使用相同的jar。Go需要更少的RAM。并且不需要任何有关安装和管理虚拟机的事项。

4、反射。与Java不同。Go的反射似乎更复杂且不那么明显。Java是一种面向对象的语言。因此除原语之外的所有内容都被视为对象。如果要使用反射。则可以为对象创建一个类。并从该类中获取所需的信息。如下所示:

Class cls = obj.getClass();

Constructor constructor = cls.getConstructor();

Method[] methods = cls.getDeclaredFields();

在Go中。没有类的概念。并且结构仅包含已声明的字段。因此。我们需要“反射”包以提供所需的信息。

Go与Java:差异

1、Golang不是OOP语言。Go的核心是缺少Java的继承。因为它没有通过继承实现传统的多态性。实际上。它没有对象。只有结构。它可以通过提供接口来模拟一些面向对象的模式。同样。可以将结构彼此嵌入。但是嵌入式结构无法访问宿主结构的数据和方法。Go使用组合而不是继承来组合一些所需的行为和数据。

2、Go是一种命令式语言。而Java则是一种声明式语言。在Go中。我们没有像依赖注入那样的东西。相反。我们必须将所有内容明确地包装在一起。因此。建议在Go中进行编程的方法是使用尽可能少的魔术。对于外部代码审阅者来说。一切应该都是显而易见的。程序员应该了解Go代码如何使用内存。文件系统和其他资源的所有机制。

另一方面。Java需要开发人员更多地关注于自定义编写程序的业务逻辑部分。以确定如何创建。过滤。更改和存储数据。就系统基础架构和数据库管理而言。所有这些都是通过配置和通过Spring Boot等通用框架进行的注释来完成的。我们对重复的基础结构部分感到枯燥乏味。而将其留给了框架。这很方便。但也会颠倒控制权。并限制了我们优化整个过程的能力。

变量定义的顺序。在Java中。可以编写如下内容:

String name;

但是在Go中。会这样写:

name string

Go的优点

简单优雅的并发。 Go具有强大的并发模型。称为“通信顺序过程”或CSP。Go使用n-to-m探查器。该探查器允许在n个系统线程中发生m个并发执行。可以使用该语言的关键字(与该语言的名称相同)以非常基本的方式启动并发例程。例如。编码人员可以编写以下字符串:

go doMyWork()

并且函数doMyWork()将同时开始执行。进程之间的通信可以使用共享内存(不推荐)和通道来完成。它允许使用GOMAXPROCS环境变量定义进程一样多的核心并行。默认情况下。进程数等于核心数。

Go提供了一种特殊模式来运行二进制文件并检查运行情况。这样。可以测试并证明软件是并发安全的。

go run -race myapp.go

我真的很欣赏Go 提供了非常有用的基本功能。即开即用 (https://golang.org/dl/)。一个很好的例子是同步“ sync” https://golang.org/pkg/sync/ 并发包。对于“一次”组类型单例模式实现。可以编写:

包同步还为并发映射实现。互斥锁。条件变量和等待组提供了一种结构。软件包“ atomic” https://golang.org/pkg/sync/atomic/ 还允许并发安全转换和数学运算-实质上是制作并发就绪代码所需的一切。

指针。使用指针。Go可以更好地控制如何分配内存。垃圾收集器有效负载以及其他Java无法实现的有趣的性能调整。与Java相比。Go感觉像是一种更底层的语言。并且支持更轻松。更快速的性能优化。

鸭子打字。 “如果它走路像鸭子。却像鸭子一样嘎嘎叫。那它一定是鸭子。” 这句话在Go中是正确的:无需定义某种结构实现给定的接口。如果该结构在给定的接口中具有相同签名的方法。则它将实现它。作为库的客户端。可以定义外部库结构所需的任何接口。在Java中。对象必须显式声明其实现了接口。

探查器。 Go的性能分析工具使分析性能问题变得方便。快捷和容易。Go中的事件探查器有助于揭示程序所有部分的内存分配和CPU使用情况。并可以在可视化图形中进行说明。从而使执行优化性能的操作非常容易。从Java VisualVM开始。Java也有许多探查器。但是它们不像Go探查器那么简单。相反。它们的功效取决于JVM的工作。因此与它们获得的统计信息和垃圾收集器的工作相关。

CGO。Go允许对C进行非常简单而强大的集成。因此可以在Go项目中编写带有C代码片段的平台相关应用程序。本质上。CGo使开发人员能够创建调用C代码的Go程序包。为了排除/包括给定平台的C代码段。有各种构建器选项。这些代码段允许应用程序的多平台实现。

用作参数。Go函数可以用作变量。传递给另一个函数或用作结构的字段。这种多功能性令人耳目一新。从Java的1.8版本开始。它结合了lambda的使用。它们不是真正的函数。而是单功能对象。尽管这有助于实现类似于在Go中使用函数的行为。但这种想法从一开始就存在于Go中。

明确的代码风格准则。 Go背后的社区充满了支持和热情。那里有大量关于使用示例和解释进行操作的最佳方法的信息。

函数可以返回许多参数。 这也是非常有用和不错的。

Go的缺点

除接口外。没有多态性。 Go中没有继承多态性。这意味着如果在同一个程序包中有两个函数具有不同的参数但含义相同。则必须给它们指定不同的名称。例如。使用此代码:

最终会采用许多方法来做相同的事情。但所有方法都具有不同的名称。

此外。如果嵌入结构。则嵌入式结构仅知道其自己的方法。而不会知道“宿主”结构的方法。

错误处理。 完全由你决定返回什么错误以及如何返回错误。因此作为开发人员。需要每次都返回错误并相应地传递错误。毫不奇怪。错误可能会被隐藏。这可能是真正的痛苦。记住要检查错误并把它们传递出去。这很烦人而且不安全。

在Java中。异常要方便得多。如果它是RuntimeException。则甚至不必将其添加到函数的签名中。

没有泛型。虽然很方便。但泛型增加了复杂性。并且当Go类型的创建者键入系统和运行时。它们被认为代价高昂。在Go中进行构建时。基本上必须针对不同的类型重复使用自己或使用代码生成。

没有注释。 虽然可以用代码生成部分替换编译注释。但不幸的是。运行时注释根本不能替换。这是有道理的。因为Go不是声明性的。并且代码中不应包含任何魔术。我喜欢在Java中使用注释。因为它们使代码更加优雅。简单。

Go中的依赖管理。 最初。除了“ Gopgk”之外没有任何依赖项管理。但最终发布的“供应商”实验后来被“ vgo”取代。然后又被1.10版“ go mod”取代。

如今。可以手动更改go.mod文件描述符。也可以使用各种Go命令(例如“ go get”)进行更改。不幸的是。这使得依赖关系变得不稳定。也没有即开即用的依赖关系管理机制提供的源镜像。有点可惜。尤其是因为Java具有诸如Maven和Gradle之类出色的声明式工具来进行依赖关系管理。它们也可用于构建。部署和处理其他CD / CI用途。

我们实际上必须使用Makefile。docker-composes和bash脚本自定义构建所需的依赖关系管理。这只会使CD / CI的过程和稳定性变得复杂。

Go微服务通常始于容器。并在本地。虚拟Linux机器或不同平台上同时终止。有时。它会使CD / CI在开发和生产周期中的工作比所需的更为复杂。

软件包的名称包括托管域名。 例如:

import “github.com/pkg/errors”

这真的很奇怪。尤其不方便。因为如果不更改整个项目代码库的导入。就无法用自己的实现替换某人的实现。

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

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

区别在于。在Go中。go get将转到by.spirascout.public并尝试获取资源。在Java中。程序包和域名不必关联。

golang和java开发选哪个?

不一定有最佳答案。在于你希望用他们开发什么项目/产品。。。。。。

Java是行业标准。相比之下。现在使用Go做开发的还是比较少。基本是些大厂和涉及大数据的项目。

但是。我非常喜欢Go。

我认为最好的办法是环顾四周。看看每种语言都可以提供哪些工作机会。

无疑。你可能不会找到很多Go作业。但是会找到很多Java。

其他观点:

我是十年程序猿。分别用过c。java。golang开发业务代码并有丰富的开发经验。我们先比较下golang和java的特点:

从功能上来讲。java可以做到的。golang也可以做到。golang能实现的。java也都能实现;

从软件集成角度看。java发展了这么多年。一些第三方的工具和类库非常丰富。golang则有些逊色。但是最近几年golang发展迅速。也在迎头赶上。

从资源使用上来看。java比较臃肿。而golang比较轻量。java程序运行起来动辄1G以上内存。但是一个golang程序可能只需要100M内存就可以完美的run起来。golang的资源节省非常的明显。

从开发成本来看。java程序员。一抓一大把。价格低廉;golang程序员则比较稀缺。笔者所在公司的hr曾经在智联招聘的后台过滤有golang开发经验的工程师。只找到30份简历。

以上就是他们的对比。各有千秋对不对?那如何选择呢?

在我看来。开发语言选哪个。绝对不是程序员自己想用哪个就用哪个的。而是要根据业务场景而定的。如果你做的产品是平台类的。上面要跑很多微服务。而且很多微服务是要跑在不同的用户空间里。那你可能更在意服务的资源消耗。因为云服务器是花钱的嘛。在这种业务场景下。使用golang就比较合适。因为它更能帮你省资源。省下来的资源就是利润。而如果是给甲方做项目。那基础设施就是甲方提供的。那在这种情况下。你就没必要省着用了。甚至有些甲方爸爸是国企。还要靠这个申请经费呢。那在这种情况下。就可以很安心的用java开发啦。

以上是我的回答。望采纳。有疑问也可以私信给我。

其他观点:

一个非常好的问题。Java是当前使用最普遍的编程语言。Go是冉冉升级的新星。根据最新2020年4月份的TIOBE编程语言指数排行榜。排名前三的分别是Java、C、Python。Go排名在第12位。

TIOBE编程排行榜根据全球工程师、课程和搜索引擎数量为指数得出。在一定程度上反映了编程语言的发展趋势。

一。编程语言

从编程语言本身来说。Java首次推出在1995年5月。Go在2009年11月正式推出。

1。Java

两种语言各有特点。Java经历了20多年。一直在不断更新推出新版本。2009年Oracle收购Sun公司后。Java发展得到了大力支持。现在使用非常多的Java8发布于2014年。当前最新版本是Java14。和早期版本相比。从Java8开始。吸收了越来越多的现代化编程语言的优点。比如lambda表达式。

2。Go

Go由Google的三位大神开发。Robert Griesemer。Rob Pike 及 Ken Thompson。是一种静态强类型、编译型语言。语法与C相近。功能更丰富:内存安全。GC(垃圾回收)。结构形态及并发计算。在2016年。Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。

二。学习难度

1。Java

Java是一种静态面向对象编程语言。继承了很多的C++优点。功能强大、简单易用、跨平台可移植。具有多线程、分布式等特点。入门学习不难。随着项目经验的积累逐步提升进阶。

2。Go

Go也是一种静态的编译型语言。语法和C相近。但是采用了不同的变量声明方式。Go支持垃圾回收功能。并行模型是以通信顺序进程(CSP)为基础。自1.8版本开始支持插件Plugin。能动态加载部分函数。从2.0开始支持泛型。

相比Java。Go内嵌了关联数组数据库类型。也称为哈希表Hashes或字典Dictionaries。就像字符串类型一样。

三。发展前景

考虑发展前景的话。推荐学习Java语言。Java是当前的主流开发语言。普遍使用在Web开发、电商系统、企业信息管理等各种行业场景。

Java社区非常活跃。各种文档和学习资料非常丰富。因为使用广泛。所以很多同事朋友沟通交流。

开发框架也是降低学习难度的有力工具。Spring框架是Java开发时常用框架。有非常丰富的组件和易用的功能。Spring Boot和Spring Cloud更是简化了开发过程中的琐碎工作。自动化配置依赖模块、开箱即用和约定优于配置。这些策略使得Spring框架在快速开发领域非常受欢迎。

我是工作多年的Web应用架构师。陆续发布关于软件开发方面的文章。欢迎关注我。了解更多IT专业知识。

您还感兴趣的文章推荐

以上就是由互联网推广工程师 桔子生活网 整理编辑的,如果觉得有帮助欢迎收藏转发~

分享到 :
相关推荐

回复 陌念 取消回复

登录... 后才能评论

评论(2)

  • 陌念 永久VIP 2022年12月28日 11:25:01

    代码,语言,结构,所需,函数,内存,垃圾,项目,编程语言,是一种

  • 旧日梦 永久VIP 2022年12月28日 11:25:01

    没想到大家都对golang和java开发选哪个?为什么?感兴趣,不过这这篇解答确实也是太好了

  • 擦掉眼泪我依然是王 永久VIP 2022年12月28日 11:25:01

    我有朋友是资深程序员。目前现在依据他的兴趣循序渐进地学习Go。而他过去十年一直在利用Java做开发。再往前他是利用C +