两种语言都用过,前期用java,来了现在的公司用的go,应该是比较有发言权的。

1、语言层面的比较

java优势:
1.1 比较强大的地方是那个jvm,他让你有一些字节码增强的技,jvm层面的语言自带的aop。
1.2 有泛型。
1.3 有annotation技术,这个貌似是java5才出来的。
1.4 面向对象语言。
1.5 有threadlocal技术

go的优势:

1.1 go有多协程的能力,有select和channel让协程能通讯。

1.2 可以定义对象为指针还是对象本体,如果返回对象本体则肯定不会出现空指针。而且go的空对象调用方法也不一定会npe,因为空对象本身不是真的空,是有类型的空对象。

1.3 面向接口的语言,有些面向对象的设计模式不太好写,不过不是重点。

1.4 方法能返回多个对象,编程不会再创建这么多class去包对象了。

1.5 异常处理机制比较特别,go官方建议大家每个函数返回err,这样当你调用方法的时候,会强制让你回答:"如果这个方法异常,你应该怎么做"。不像java,都是throw出去,所以go编程的异常case会少一些。不过这样也让代码很臃肿,到处都是if err!= nil 。

go语言写起来会感觉比较简洁,而且会少很多npe空指针异常,但是由于异常处理,满天都是if err!=nil,没有threadlocal,每个方法固定第一个参数都是ctx,而且没有aop、没有泛型、没有annotation技术,重复的代码有会变得很多,只能通过一些函数式编程来减少这些重复的代码,但是这样又变得不够优雅了。

java写起来会经常出现万恶的npe满天都是if(obj == null)。但是由于有spring和jvm的字节码增强技术会让减少很多重复的编程,会让代码编程很优雅。java写起来会比较有架构师的感觉。

但是jvm和spirng又会让程序变得很重,大家启回想一下,启动一个大的springboot工程要多长时间,跑一个springboot的单测又等了多长的时间。。。go的单测跑起来就很快,因为go跑单测是需要什么文件才编译对应的文件。

2、生态层面的比较

主要还是一些重复的轮子问题,java有springmvc,spring,mybati,springboot,springcloud体系,netty、xxjob等各种框架,链路跟踪有skywaling、pinpoint等基于apm技术的包。基本上你遇到的问题都会有现成的java语言解决方案。

而go。。。gin、gorm、grpc,貌似就没了,很多东西都比较基础,比较多东西都需要自己去扩展和开发。。。而且由于没有aop技术,链路跟踪基本是要做代码的入侵,反正是不太优雅。
在我看来java更适合做业务开发,而go更适合做对性能有要求的中间件开发。

3、市场层面的比较

由于培训班大批量生产java人员,现在满地都是java的初级开发,但是我倒没怎么听过go的初级开发?

java的需求是巨大的,而市面上求职的人也是巨大的。

go的需求比较少,主流go的公司就那么几家,小公司基本不用go。

一线开发薪资的话,java工资应该是比go低一些的,因为go的人才不好找,字节基本是java、c++的都招过来写go,因为市面上会go的人太少了。

但是java比较容易当架构师,因为小公司基本用java,而架构师的工资基本是领先一线开发的。
所以如果你是开发部门的一把手,你要选择一门语言作为公司的主要开发语言,除非你很熟悉go,不然就找人成本和找人速度来说,java会是更好的选择。

如果你是一个一线普通开发打工人,你想一想你短期学习后有没有机会进字节、虾皮这种公司,如果你感觉你没什么机会进这些公司的话,我建议你还是学java,毕竟需求量比较大,而且就算你学java,你一样能进字节。。。

总体来说,go是未来可期待的语言,但是java更加适合作为大部分开发的第一语言。

最近,我为自己整理了一些优质的 Java 学习资源,也分享给大家,希望帮助到更多同学!有需要的可以自取,无任何套路:

祝大家前程似锦,在编码的道路上一马平川。

码字不易,硬核码字更难,希望大家不要吝啬自己的鼓励,给我 :

一个点赞,鼓励下我!

共勉。