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环境变量定义进程一样多的核心并行 。默认情况下 。进程数等于核心数 。

推荐阅读