Java和Go都在用,goroutine是加分项,但绝对不是决定性因素,甚至连重要因素都算不上。简单对比一下我看中的几个点。

打包大小

  • 不算JRE,Java一般20M以上,JVM平台其它语言往往还有10M这个量级的运行库
  • Go没有GRE,strip之后一般不到10M,绝大部分情况下可以控制在20M以内

这点Go完胜Java以及JVM上其它语言,一个JRE大小就顶几个Go项目了。

内存占用

  • JVM有VM和JIT的开销,对某些设备不友好,如树莓派
  • Go整体上比JVM语言省内存,省的还不少

树莓派这类性能低的设备,和低端VPS,Go比Java合适很多

工具链

  • Maven / Gradle依赖管理和build控制,比Go那些要强的多
  • IDE和调试工具,目前也是JVM方案更丰富和完备
  • 国内Mavan镜像很多,基本不依赖科学上网

这点Java完胜

语言特性

  • Java有范型,有异常,有Swing/JavaFX,有极其丰富的开源库
  • Go有goroutine,JVM也有Actor(Scala)和Coroutine(Kotlin)
  • 实现同样的功能,Go的代码行数并没有减少
  • Go不用加密代码,Java的class反汇编后约等于源码
  • 性能两者差不多,JVM提供了更多的GC算法和微调参数

语法层面,Go是不如Java的,远不如Scala或者Kotlin,仅凭goroutine一点,不足以选择。况且大部分项目根本不需要goroutine,无脑开几百几千线程也能搞定。或者安排线程池。

职位供求

  • Java开发人员数量,比Go高一个数量级
  • Java招聘职位,比Go多一个数量级

从就业和雇佣双方来看,Java都要合适的多。


所以我能用Java(Kotlin)的地方,都用了Java(Kotlin),极少情况下才用Go。我记得之前看过一个报告,Python/PHP/Ruby转Go的比较多,JVM转Go的比较少,毕竟没有性能提升,换一个写起来更罗嗦的语言是没有道理的。