强行让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对比一波[持续更新]
概述 很多Java开发如果想转Golang的话,比较让Java开发蛋疼的第一是语法,第二是一些思想和设计哲学的Gap,所以我这儿强行整理一波Java和Golang的对比,但是由于GO和Java在很多方面都有不同的设计,所以这些对比的项可以更…...
理解七层网络协议
osi体系结构 上三路(管数据) 应用层 通过http等,把传输的格式,数据打包 处理网络应用。直接为端用户服务,提供各类应用过程的接口和用户接口。例如:HTTP、Tenlent、FTP、SMTP、NFS等。基于TCP的FTP、HTTP…...

网络协议——HTTP协议
目录 编辑 一,HTTP协议基本认识 二,认识URL 三,http协议的格式 1,发送格式 2,回应格式 四,服务端代码 五,http报文细节 1,Post与Get方法 2,Content_lenth 3&…...

八股面试——数据库——索引
索引的概念 B树的概念: 索引的作用 聚簇索引与非聚簇索引 聚簇索引就是主键值,在B树上,通过主键大小(数据在B树叶子节点按主键顺序排序)寻找对应的叶子节点,叶子节点保存的一整条记录。 非聚簇索引&#x…...

【二分查找】Leetcode 二分查找
题目解析 二分查找在数组有序可以使用,也可以在数组无序的时候使用(只要数组中的一些规律适用于二分即可) 704. 二分查找 算法讲解 当left > right的时候,我们循环结束,但是当left和right缩成一个点的时候&#x…...

Python+Vuecil笔记
Nginx 进入目录: C:\nginx-1.20.2\nginx-1.20.2 start nginx 开始 nginx -s stop 停止 nginx -s quit 退出CSS 通过标签去写css 循环展示数据 JS 点击时执行事件 Django 配置media 在seetings里面修改 STATIC_URL /static/ MEDIA_URL /upload/ MEDIA_ROOT os.pat…...
C语言关于随机数知识点的总结
在C语言中,随机数的生成通常依赖于特定的库函数,最常用的是 <stdlib.h> 头文件中的 rand() 函数。以下是对随机数知识点的总结、举例和分析: 随机数知识点总结 1.随机数种子:rand() 函数生成的随机数是伪随机数࿰…...

网络应用层和传输层
网络中有很多协议这些协议的不同导致了分层这一现象,不同层的主要功能不一样。 应用层:应用程序。数据具体如何使用 传输层:关注起点和终点 网络层:关注路径规划 数据链路层:关注相邻节点的转发 物理层࿱…...
Vue3:优化-从响应式数据中获取纯数据
一、情景说明 我们知道,Vue3中,创建变量时,常用ref、reactive来包裹,这样,这个变量就是响应式数据 然而,有时候,我们只需要纯数据 例如,我们在调用后端接口的时候,我们只…...

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?
C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成? 手术麻醉系统与医院信息系统的集成是一个关键步骤,它有助于实现信息的共享和流程的协同,从而提高医疗服务的效率和质量。手麻系统与lis、his、pacs等系统的对接是医院信息化建设的重…...

学习CSS Flexbox 玩flexboxfroggy flexboxfroggy1-24关详解
欢迎来到Flexbox Froggy,这是一个通过编写CSS代码来帮助Froggy和朋友的游戏! justify-content 和 align-items 是两个用于控制 CSS Flexbox 布局的属性。 justify-content:该属性用于控制 Flexbox 容器中子项目在主轴(水平方向)…...
springboot项目如何配置跨域?
在Spring Boot项目中配置跨域(CORS,Cross-Origin Resource Sharing)主要是为了允许来自不同源(不同的协议、域名或端口)的前端应用能够访问后端API。Spring Boot提供了多种方式来配置跨域支持。 1. 使用CrossOrigin注…...

实现第一个动态链接库 游戏插件 成功在主程序中运行 dll 中定义的类
devc 5.11编译环境 dll编译环境设置参考 Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 插件 DLL代码和主程序代码如下 注意 dll 代码中的class 类名需要 和主程序 相同 其中使用了函数指针和强制类型转换 函数指针教程参考 以动态库链接库 .dll 探索结构体…...

算法第三十九天-验证二叉树的前序序列化
验证二叉树的前序序列化 题目要求 解题思路 方法一:栈 栈的思路是「自底向上」的想法。下面要结合本题是「前序遍历」这个重要特点。 我们知道「前序遍历」是按照「根节点-左子树-右子树」的顺序遍历的,只有当根节点的所有左子树遍历完成之后…...
Rust---复合数据类型之字符串与切片(2)
目录 字符串操作删除 (Delete)连接 (Concatenate)字符串转义前情回顾: Rust—复合数据类型之字符串(1) 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型,分别是: pop(),remove(),truncate(),clear(),此外还有drain() 方法。 pop 方法:pop() 方法返回一个 O…...

iOS 应用内网络请求设置代理
主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用,我们可以通过界面来进行设定(是否开启代理、服务端、端口),从而达到类似系统上的设定 具体链接参考:为 iOS 网络请求设置代理…...
什么是MariaDB
2024年4月6日,周六晚上 今晚在Debian12上安装mysql时,运行后却发现是MariaDB MariaDB是一个开源的关系型数据库管理系统(RDBMS),它是MySQL的一个分支和替代品。MariaDB由MySQL的原始开发者之一Michael "Monty&qu…...

【面试八股总结】传输控制协议TCP(三)
参考资料 :小林Coding、阿秀、代码随想录 一、TCP拥塞控制⭐ 1. 慢启动 – Slow Start 慢启动是指TCP连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了网络通道的秩序。 慢启动算法: 初始拥塞窗口…...

今年过去了多少天?(switch)
//今年已经过去了几天? #include <stdio.h> int monthday(int year,int month){switch(month){case 1:return 31;case 2:if ((year % 4 0 && year % 100 ! 0)||year % 400 0){return 29;}else{return 28;}break;case 3:return 31;case 4:return 30;…...

提升团队工程交付能力,从“看见”工程活动和研发模式开始
作者:张裕、雅纯 理想中的研发团队应当具有以下特征: 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力,以便能够正确评估优先级࿰…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...