本文主要是介绍强行让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 | Java 数组 | int[] a = new int[5]; |
切片 | var s []int | List 接口实现类,如 ArrayList [学习链接](逐步学习Go-集合(Arrays, Slices,Map,Set)) | List<Integer> s = new ArrayList<>(); |
哈希表 | map[string]int | 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) } | 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: ... } 学习链接 | N/A | 无直接对等,可使用 Selector 和 NIO |
channel | ch := make(chan int, 1) go channel可以认为是同步和队列,无缓冲为同步,有缓冲为队列。 学习链接 | BlockingQueue | BlockingQueue q = new ArrayBlockingQueue(1024); |
协程(goroutine) | go func(){println("hello world")}() , 轻量级线程,学习 | ||
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 学习链接 | interface / class | Java直接定义一个接口,一个class implements 接口,比如: class Person implements Human |
sync.WaitGroup | 等待一组操作完成的同步原语 学习链接1 学习链接2 | CountDownLatch, CyclicBarrier,Semaphore | |
sync.Once | 整个应用声明周期中只执行一次 学习连接 | AtomicBoolean | Java中没有直接对应,但是根据sync.Once的底层实现,其实就是原子变量+锁来保证的,所以使用AtomicBoolean来对应是没有问题的 |
sync.Mutex | 锁 | ReentrantLock | |
sync.RWMutex | 读写锁 | ReentrantReadWriteLock |
这篇关于强行让Java和Go对比一波[持续更新]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!