强行让Java和Go对比一波

内容纲要

概述

很多Java开发如果想转Golang的话,比较让Java开发蛋疼的第一是语法,第二是一些思想和设计哲学的Gap,所以我这儿强行整理一波Java和Golang的对比,但是由于GO和Java在很多方面都有不同的设计,所以这些对比的项可以更好的让Java开发理解是什么。

主题和概念对比

Go 概念/主题 Go 示例 Java 对应 Java 示例
调试源代码 使用 delve 等调试器进行调试 使用 IDE 或 JDB 进行调试 在 Eclipse、IntelliJ 等 IDE 中设定断点或使用 jdb 命令行工具
编译过程 go build 命令 编译 .java 文件到 .class 文件 使用 javac ClassName.java
词法分析和语法分析 go/parser 包 ANTLR, JavaCC 等库 使用 ANTLR 生成的解析器解析代码
类型检查 go/types 包 Java 编译器自带的类型检查 编译过程中自动完成
中间代码生成 Java ByteCode 是中间表示形式 使用 javac 编译时自动生成
机器码生成 Go 编译器生成机器码 JVM 执行 Java ByteCode 生成机器码 JVM 在运行时完成
数组 var a [5]int
逐步学习Go-集合(Arrays, Slices,Map,Set))
Java 数组 int[] a = new int[5];
切片 var s []int

逐步学习Go-集合(Arrays, Slices,Map,Set))

逐步学习Go-Slice(切片)还可以多挖一下

List 接口实现类,如 ArrayList List<Integer> s = new ArrayList<>();
哈希表 map[string]int
逐步学习Go-集合(Arrays, Slices,Map,Set))
Map 接口实现类,如 HashMap Map<String, Integer> m = new HashMap<>();
字符串 var str string String 类 String str = "example";
函数调用 func callFunction(a int) {} Java 方法调用 public void callFunction(int a) {}
接口 type Reader interface { Read(p []byte) (n int, err error) }
逐步学习Go-OOP编程
Java 接口 interface Reader { int read(byte[] p) throws IOException; }
反射 reflect java.lang.reflect 使用 Class.forName() 等方法
for 和 range for i, v := range slice { ... } for-each 循环 for (Type v : iterable) { ... }
select (多路复用) select { case <-ch1: ... case <-ch2: ... }
逐步学习Go-Select多路复用
N/A 无直接对等,可使用 Selector 和 NIO
channel ch := make(chan int, 1)
go channel可以认为是同步和队列,无缓冲为同步,有缓冲为队列。
逐步学习Go-并发通道chan(channel)
BlockingQueue BlockingQueue q = new ArrayBlockingQueue(1024);
协程(goroutine) go func(){println("hello world")}(), 轻量级线程,逐步学习Go-协程goroutine Virtual Thread, JDK 19引入, Thread thread = Thread.startVirtualThread(() -> {
defer (延迟执行) defer fmt.Println("done") try-finally try { ... } finally { System.out.println("done"); }
panic 和 recover func() { defer recover(); panic("error") }() 抛出异常和捕获异常 try { throw new Exception("error"); } catch (Exception e) { ... }
make 和 new (内存分配) make([]int, 0)new(int) new 关键字,以及集合类的构造器 new int[0]Integer i = new Integer(0);
上下文 Context context 无直接对等,可以创建自定义类或使用线程本地变量 使用 ThreadLocal<T> 存储上下文相关数据
同步原语和锁 sync 包中的 Mutex 和 WaitGroup java.util.concurrent 包中的 Locks等 ReentrantLockCountDownLatch
定时器 time.Aftertime.NewTicker java.util.Timer 和 ScheduledThreadPoolExecutor TimerScheduledExecutorService
Channel (协程间通信) ch := make(chan int) java.util.concurrent 中的 BlockingQueue BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
调度器 Go 语言运行时调度器 Java 线程调度器(JVM运行时管理) JVM负责线程调度
网络轮询器 net 包 NIO 的 Selector Selector selector = Selector.open();
系统监控 runtimeexpvar JMX (Java Management Extensions) 使用 MBeanServer 监控应用
内存分配器 Go 语言运行时内存分配 JVM内存分配 JVM自动管理
垃圾收集器 Go 语言的垃圾收集器 JVM 的 GC JVM自动管理,可以使用 -XX:+UseG1GC 等JVM参数
栈内存管理 Go 语言运行时栈管理 JVM栈管理 JVM自动管理
插件系统 plugin OSGi 或者自定义 ClassLoader 使用 OSGi 框架
代码生成 go generate 和 AST 操作 Annotation Processing Tool (APT) 使用 Java 注解处理器生成代码
JSON encoding/json org.json 或 Jackson 等库 使用 Jackson 的 ObjectMapper
HTTP net/http java.net.HttpURLConnection 或 HttpClient 使用 HttpURLConnection 或 Apache HttpClient
数据库 database/sql JDBC 使用 java.sql.Connection 等类
Gin Web框架 Spring Boot
Beego Web框架 Spring Boot
OOP interface/ struct, Go中interface是一个类型,接口定义方法,struct只要实现了interface定义的所有方法就实现了这个interface 逐步学习Go-OOP编程 interface / class Java直接定义一个接口,一个class implements 接口,比如: class Person implements Human
sync.WaitGroup 等待一组操作完成的同步原语
逐步学习Go-WaitGroup
学习链接2
CountDownLatch, CyclicBarrier,Semaphore
sync.Once 整个应用声明周期中只执行一次
逐步学习Go-sync.Once(只执行一次)Exactly Once
AtomicBoolean Java中没有直接对应,但是根据sync.Once的底层实现,其实就是原子变量+锁来保证的,所以使用AtomicBoolean来对应是没有问题的
sync.Mutex 互斥锁,个人感觉go的互斥锁算是Java Synchronized和ReentrantLock的一个综合体
逐步学习Go-sync.Mutex(详解与实战)
Synchronized, ReentrantLock
sync.RWMutex 读写锁
逐步学习Go-sync.Mutex(详解与实战)
ReentrantReadWriteLock
切片 动态数组
Go Slice【官方Wiki】
ArrayList

注意

一些Go中的特性在Java没有直接的对应,比如:Select和context,以及Go中没有VM的概念,但是Go也是自动垃圾回收。

2人评论了“强行让Java和Go对比一波”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部