前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java转Go的A型路,让你从弯道超车,早日抓住Golang这一杀器 —— 语言浅析

Java转Go的A型路,让你从弯道超车,早日抓住Golang这一杀器 —— 语言浅析

原创
作者头像
Karos
发布2024-11-14 01:13:49
380
发布2024-11-14 01:13:49
举报

哈喽,大家好,我是程序员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的公司,毕竟都是后端。

如果是走后端开发,其实学习路线也是大相庭径的: 语法基础、各种数据库、消息队列、网络编程框架、设计模式、微服务...等等,然后就是针对不同的语言进行不同的八股文吟唱,当然项目经验也很重要。

个人接触Go之后的感触

go从语法上来看确实比较简单,用组合的方式代替继承,没有显式继承,这样大大增大了系统的灵活度,但是对泛型的支持还是有待优化,同时相比Java来说,生态较少,原生也不支持Stream流等操作,开启协程特别方便,在函数前面加个go就可以。

如果让我来做为一个项目架构来进行语言选择的话,主要还是看团队中大家最熟悉的语言吧,其次对于业务来进行具体的选型,需要cpu处理过多的,选择java,大量并发的选择go,混合使用,而且go原生支持rpc(虽然一般用grpc)。

不过最近也在思考一个问题,既然有了GMP模型,还有没有必要用协程池呢?欢迎大家讨论(具体的我们下一期解答)。

下一期:Java转Go的A型路,让你从弯道超车,早日抓住Golang这一杀器 —— 如何从Java快速转型到Golang

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要学习Go
    • 技术分析
      • 行情分析(主要针对校园招聘的情况)
      • 个人接触Go之后的感触
      相关产品与服务
      消息队列
      腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档