内容目录
概述
很多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
|
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等 | ReentrantLock 和 CountDownLatch 类 |
定时器 | time.After 和 time.NewTicker |
java.util.Timer 和 ScheduledThreadPoolExecutor | Timer 和 ScheduledExecutorService |
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(); |
系统监控 | runtime 和 expvar 包 |
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也是自动垃圾回收。
还有并发包
还有一些框架,gin. beego ORM authentication 等等