大彬2022年8月7日大约 10 分钟

大家好,我是大彬~

最近有读者问了我一个问题:Java和Golang怎么选?下面分享我的看法。

作为非科班转码的选手,曾经也很纠结这个问题。

Java是当前使用最热门的编程语言,Go最近也很火,很多公司比如bilibili后台转向Go开发,头条的后台只用Python和Go。根据最新2022年2月份的TIOBE编程语言指数排行榜,排名前三的分别是Python、C和Java,Go排名在第11位。

以下从三个方面来分析:

一、编程语言

从编程语言本身来说,Java在1995年5月首次推出,Go在2009年11月正式推出。

1、Java

两种语言各有特点,Java经历了20多年,一直在不断更新推出新版本。2009年Oracle收购Sun公司后,Java发展得到了大力支持,现在使用非常多的Java8发布于2014年,当前最新版本是Java18,于2022年3月份发布。和早期版本相比,从Java8开始,吸收了越来越多的现代化编程语言的优点,比如lambda表达式。

Java 要求开发人员更多地地关注程序的业务逻辑,知道如何创建、过滤、修改和存储数据。系统底层和数据库方面的东西都是通过配置和注解来完成的(比如通过 Spring Boot 等通用框架)。

2、Go

Go由Google的三位大神开发,Robert Griesemer,Rob Pike 及 Ken Thompson,是一种静态强类型、编译型语言,语法与C相近,功能更丰富。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。

Go 不是面向对象编程语言。Go 没有类似 Java 的继承机制,因为它没有通过继承实现传统的多态性。实际上,它没有对象,只有结构体。它可以通过接口和让结构体实现接口来模拟一些面向对象特性。此外,你可以在结构体中嵌入结构体,但内部结构体无法访问外部结构体的数据和方法。Go 使用组合而不是继承将一些行为和数据组合在一起。

Go 是一种命令式语言,Java 是一种声明式语言。Go 没有依赖注入,我们需要显式地将所有东西包装在一起。因此,在使用 Go 时尽量少用“魔法”之类的东西。一切代码对于代码评审人员来说都应该是显而易见的。Go 程序员应该了解 Go 代码如何使用内存、文件系统和其他资源。

二、学习难度

1、Java

Java是一种静态面向对象编程语言,继承了很多的C++优点,功能强大、简单易用、跨平台可移植,具有多线程、分布式等特点。入门学习不难,随着项目经验的积累逐步提升进阶。

2、Go

Go也是一种静态的编译型语言,语法和C相近,但是采用了不同的变量声明方式。Go支持垃圾回收功能,并行模型是以通信顺序进程为基础,自1.8版本开始支持插件Plugin,能动态加载部分函数。从2.0开始支持泛型。

相比Java,Go内嵌了关联数组数据库类型,也称为哈希表Hashes或字典Dictionaries,就像字符串类型一样。 Go 也没有继承多态性。被嵌入到结构体里的结构体只知道其自己的方法,对“宿主”结构体的方法一无所知。

对于Java开发人员来说,这尤其具有挑战性。 不过,随着时间的推移,我开始意识到这种处理多态性的方法只是另一种思维方式,而且是有道理的,因为组合比继承更加可靠,并且运行时间是可变的。 错误处理。在 Go 中,完全由你来决定返回什么错误以及如何返回错误,因此作为开发人员,你需要负责返回和传递错误。毫无疑问的是,错误可能会被隐藏掉,这是一个痛点。时刻要记得检查错误并把它们传递出去,这有点烦人,而且不安全。

当然,你可以使用 linter 来检查隐藏的错误,但这只是一种辅助手段,不是真正的解决方案。在 Java 中,处理异常要方便得多。如果是 RuntimeException,甚至不必将其添加到函数的签名中。

三、发展前景

考虑发展前景的话,推荐学习Java语言。Java是当前的主流开发语言,普遍使用在Web开发、电商系统、企业信息管理等各种行业场景。

不信你打开招聘网站,搜搜Java和Go岗位的招聘量。如下图,同一地区,Java招聘岗位是500+,Go招聘岗位是175。由此看来,Java岗位的需求量还是比较多的(当然Java方向也比较卷)。

Java社区非常活跃,各种文档和学习资料非常丰富。因为使用广泛,所以很多同事朋友沟通交流。 开发框架也是降低学习难度的有力工具,Spring框架是Java开发时常用框架,有非常丰富的组件和易用的功能,Spring Boot和Spring Cloud更是简化了开发过程中的琐碎工作,自动化配置依赖模块、开箱即用和约定优于配置,这些策略使得Spring框架在快速开发领域非常受欢迎。

参考链接:https://juejin.cn/post/6960553709357154311open in new window

如果你还在这两种语言之间犹豫不定的话,那就来卷Java吧。

下面附上Java学习路线,是我自学Java过程踩坑总结出来的,希望能帮到你们!

Java

刚开始入门看的马士兵老师的JAVA基础视频,后面发现看视频效率较低,于是抛弃看视频学习的方式,转向看书(每个人学习方式不一样,个人觉得看视频学习,不好做笔记,而且经常看了就忘,所以后期自学基本以看书为主)。

推荐书籍:

  • 《head first java》
  • 《JAVA核心技术卷》

head first系列的书籍讲解比较有趣,比较好理解。《JAVA核心技术卷》难度相对适中,内容也比较全面,部分章节(如Swing)可以跳过。

Java视频学习路线可以参考我的另一个回答:https://www.zhihu.com/question/433615385/answer/2244848102open in new window

Java基础知识主要有:

  • 类与对象
  • 面向对象特性
  • 抽象类和接口
  • 数据类型、重写重载、封装继承多态
  • 容器类Map/List/Set等
  • IO操作:InputStream , OutputStream, Reader/Writer, 文件读取,各种流读取等
  • 异常处理
  • 反射机制
  • 泛型

数据库

数据库也是必学的一块内容,主要是MySQL数据库。书籍推荐:

  • 《MySQL必知必会》
  • 《高性能mysql》

《MySQL必知必会》主要是Mysql的基础语法,很好理解。后面有了基础再看《高性能mysql》,这本书主要讲解索引、SQL优化、高级特性等,很多Mysql相关面试题出自《高性能MySQL》这本书,值得一看。

MySQL基础知识:

  • 增删改查
  • 事务特性、隔离级别
  • 索引原理、优化
  • b+树
  • 最左匹配原则
  • 存储引擎
  • MVCC
  • 执行计划
  • 分库分表
  • 日志,bin log/undo log/redo log
  • ...

框架

主流框架主要有:

  • spring:面向切面、依赖注入。
  • springboot:习惯优于配置、自动配置。目前很多公司内部都是使用Spring Boot。
  • springmvc:基于MVC架构模式的轻量级Web框架
  • Mybatis:orm框架。
  • springcloud

Spring

大部分公司都会用到 Spring框架,必学!。主要理解 Spring 面向切面、依赖注入的特性,学会使用 Spring 构建应用程序。推荐书籍《Spring实战》,通过demo的方式带你一步步搭建Spring应用

SpringMVC

SpringMVC是基于MVC架构模式的轻量级Web框架,对于初学者,需要掌握Web请求从发出到相应的这个过程,SpringMVC做了什么,还有MVC模式的思想。

Mybatis

MyBatis 是一款优秀的持久层框架,MyBatis 帮助我们做了很多事情:建立连接、操作 Statment、ResultSet、处理 JDBC 相关异常等,简化了开发流程。推荐书籍《深入浅出Mybatis》。

SpringBoot

学完 SSM,就要进一步学习 SpringBoot 了,相信很多人在学了 Spring 之后,面对各种各样的配置,想必都会头疼。而 SpringBoot 的出现解决了这个问题,SpringBoot 去除了大量的 XML 配置文件,简化了复杂的依赖管理。书籍推荐《Spring Boot实战》。

SpringCloud

现在面试基本都会问到微服务相关的内容,最好了解下微服务相关的知识。服务注册与发现、负载均衡、服务降级、API网关等。推荐书籍《spring cloud微服务实战》

中间件

  • redis:用来缓存热点数据,加快读写速度,从而提高性能。推荐书籍《redis实战》和《redis设计与实现》
  • rabbitMQ:消息队列是基础数据结构中FIFO的一种数据结构,用来解决应用解耦、异步消息、流量削锋等问题,可以实现高性能、高可用、可伸缩和最终一致性。
  • kafaka:一种分布式的,基于发布/订阅的消息系统。

JVM

jvm也是面试经常会问的内容。Java开发者不用自己进行内存管理、垃圾回收,jvm帮我们做了,但是还是有必要了解下jvm的工作原理,这样在出现oom等问题的时候,才有思路去排查和解决问题。书籍推荐周老师的《深入理解Java虚拟机》。

jvm的基础知识:

  • jvm内存结构(程序计数器、虚拟机栈、本地方法栈、堆、方法区、运行时常量池、直接内存)
  • 类加载过程
  • 双亲委派
  • 垃圾回收算法
  • 垃圾回收器
  • 调优工具(jsp/jstack/jstat/jmap,了解即可)

并发

并发编程的相关内容可以看看《JAVA并发编程实战》这本书,主要内容有:

  • 线程池原理
  • 线程间通信方式
  • 锁(synchronized、ReentrantLock)
  • 并发工具类(CountDownLatch/CyclicBarrier/Semaphore)
  • 原子类
  • AQS

计算机基础知识

平时抽空学习计算机基础知识,巩固基础。

数据结构和算法

推荐书籍《数据结构与算法分析 java语言描述》,用Java语言描述各种数据结构和算法,对于Java开发者来说,更容易理解,主要学习以下内容:

  • 基本数据结构(数组、链表、栈、队列等)
  • 树(二叉树、avl树、b树、红黑树等)
  • 堆结构
  • 排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等及时间空间复杂度)
  • 动态规划、回溯、贪心算法(多刷刷leetcode)

计算机网络

推荐《计算机网络自顶向下方法》:

  • 网络分层结构
  • TCP/IP
  • 三次握手四次挥手
  • 滑动窗口、拥塞控制
  • HTTP/HTTPS
  • 网络安全问题(CSRF、XSS、SQL注入等)

操作系统

学起来比较头大,可以到b站找找视频看,推荐清华大学的公开课open in new window。书籍推荐《深入理解计算机系统》,大部头,经典书籍,值得多读几遍。

核心知识点:

  • 进程和线程
  • 内存管理
  • 文件管理
  • I/O
  • 死锁
  • ...

linux

要熟悉常用的Linux命令。推荐书籍《鸟哥的linux私房菜》。

码字不易,小伙伴们觉得有帮助的话,点个赞呗 你的赞就是我创作的动力!

我是 @程序员大彬open in new window ,定期会分享Java后台硬核知识,欢迎大家关注~