哈喽,大家好,我是程序员Karos,在之前我的大部分博客都是Java的,大家也知道,之前我主要是做Java方向,不过最近我个人也在学习Go的路线,这篇文章主要带大家简单了解一下Go语言和Java语言的区别
为什么要学习Go这里我们从不同的观察点来看,分别从技术上和行业上。
技术分析作为技术人,那么我们首先从技术上面来分析,直击要点。
性能上Go 编译型语言,在执行速度和内存占用上要优于java,垃圾回收上对指针进行回收,通过三色标记法和混合写屏障(后面有机会聊)来避免来GC时的STW,支持用户态的GMP模型的协程调度Java 半编译半解释型语言,垃圾回收上采用GC Root进行可达性分析和标记(期间可能会产生STW,不过随着G1和ZGC对出现,和Go的差距也在变小),在Java21之前只支持线程调度的(当然也可以使用第三方库支持协程),在21之后开始支持虚拟现场。语言特性上Java:属于纯面向对象语言,万物皆对象,如果java用的多,对继承、多态很熟悉的话,能够很明显的感受到和go的差距Java支持泛型,并且支持泛型限定(支持上下界限 extend 和 super)线程上下文可以通过ThreadLocal来进行变量传递,也可以通过Thread来获取线程对象,也可以进行一些线程操作支持lambda表达式类和对象灵活,开发者可以无视指针和值的关系,直接使用(因为Java把指针给隐藏了,万物皆对象,万物皆指针)方法传数组时是直接传递数组(拷贝的数组地址,整体浅拷贝)支持方法泛型空对象无法调用方法通过try-catch-finally和throw/throws捕获和抛出异常/值go:支持面向对象,但是不完全支持,不支持继承,如果硬要说支持的话,我认为叫做 组合 更好go也支持泛型,但是不能做上下限定,所以有时候做的很复杂,这一点确实没java灵活go的使用协程开发,go为了简单,没有协程对象这一概念,不能对协程进行强制控制,但是可以通过context或者time.After来进行超时控制(或者通过sync包进行控制),如果要传值,是通过匿名函数调用的方式语法简单,不需要lambda表达式,但是我更希望出一个需要注意指针传递和引用传递方法/函数传递数组时时CopyOnWirte(写时复制,深拷贝)不支持方法泛型null值也能调用自身的方法,但是读取数据会报错通过panic和recover进行抛出(这里便于理解,其实是恐慌)和捕获更多的特性区别,如:反射、线程池和协程、初始化等等区别,我们在后面的文章中讲。
项目技术选型上:
对于具体的项目选型,个人建议按照团队人员具体的语言习惯来定。Go的话适合轻量级项目、快速上线等等,同时适合任务简单和高并发的情况。Java的话适合较为复杂的系统编写,适合cpu密集型的项目处理。
在云原生时代可以考虑两种语言都采用,分别处理不同的业务板块,在这个技术发展的浪潮下,掌握多种语言是一个开发者的必经之路。行情分析(主要针对校园招聘的情况)从当前市场趋势来看,Java的岗位多,但是投递的人也很多,同时也趋向于人才饱和,近两年大部分Java岗位的薪资也比往期有所下降
总体来说,除了大厂外,大部分企业的开出的薪资相比以前都有所下降。
对于2025年校招行情(来源于某面经网):
总体来说,今年也有好转的趋势,这里只是简单的给大家了解下情况,如果想要了解更真实的校招,可以去牛客网看一下。
今年相比过去两年确实好一点,但是对于开发岗来说,还是比较看学历,目前拿出offer来show的同学大部分都是985和211的同学,双非的同学还是比较少,对学历还是有一定要求。
如果选择Go作为主要开发语言,目前的话,Go学习的人相比java来说少一些的,但是岗位也少,只有大厂、独角兽和一些初创公司在用。
学习Golang,也可以让自己的就业面相对广一些,虽然你会Java,你也可以面试Golang的公司,毕竟都是后端。
如果是走后端开发,其实学习路线也是大相庭径的: 语法基础、各种数据库、消息队列、网络编程框架、设计模式、微服务...等等,然后就是针对不同的语言进行不同的八股文吟唱,当然项目经验也很重要。
除此之外,也有用于区块链开发的场景,比如分布式共识算法Raft,很多教程都是使用go来写的。
个人接触Go之后的感触go从语法上来看确实比较简单,用组合的方式代替继承,没有显式继承,这样大大增大了系统的灵活度,但是对泛型的支持还是有待优化,同时相比Java来说,生态较少,原生也不支持Stream流等操作,开启协程特别方便,在函数前面加个go就可以。
如果让我来做为一个项目架构来进行语言选择的话,主要还是看团队中大家最熟悉的语言吧,其次对于业务来进行具体的选型,需要cpu处理过多的,选择java,大量并发的选择go,混合使用,而且go原生支持rpc(虽然一般用grpc)。
不过最近也在思考一个问题,既然有了GMP模型,还有没有必要用协程池呢?欢迎大家讨论(具体的我们下一期解答)。
下一期:Java转Go的A型路,让你从弯道超车,早日抓住Golang这一杀器 —— 如何从Java快速转型到Golang