强行让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;…...
提升团队工程交付能力,从“看见”工程活动和研发模式开始
作者:张裕、雅纯 理想中的研发团队应当具有以下特征: 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力,以便能够正确评估优先级࿰…...
Pixel Dimension Fissioner效果对比:传统改写工具 vs 维度裂变器语义丰富度测评
Pixel Dimension Fissioner效果对比:传统改写工具 vs 维度裂变器语义丰富度测评 1. 评测背景与工具介绍 在文本处理领域,改写工具的质量直接影响创作效率与内容质量。本次评测将对比传统AI改写工具与Pixel Dimension Fissioner(维度裂变器&…...
全任务零样本学习-mT5中文-base效果实测:温度0.9 vs 1.2增强多样性对比
全任务零样本学习-mT5中文-base效果实测:温度0.9 vs 1.2增强多样性对比 最近在折腾文本数据增强,发现了一个挺有意思的模型——全任务零样本学习-mT5中文-base。这名字听起来有点绕,简单说,它就是一个专门为中文文本“改写”和“…...
2026 年企业级低代码开发平台哪个更值得选?横向测评 9 款热门平台
企业数字化的节奏越来越快,低代码也从“做表单审批”走到了“承接企业级系统”的阶段:能不能跑通复杂流程、能不能接入一堆老系统、能不能在多端交付、能不能把能力沉淀下来复用……这些才是企业在选型时真正会反复追问的点。 这篇文章我按企业级项目里…...
003 TimeTagger 时间跟踪工具本地部署与开机自启
TimeTagger 本地部署与开机自启手册 一、TimeTagger 产品介绍 TimeTagger 是一款轻量级、开源免费的Web端时间跟踪工具,基于PythonWeb技术开发,支持本地离线运行、时间记录分类、数据统计分析,无需云端账号即可实现数据本地持久化存储&#…...
Make构建原理与嵌入式工程实践
1. Make工程管理工具原理与实践1.1 多源文件编译的工程化挑战在嵌入式Linux开发环境中,开发者通常面对的是无图形界面、无集成开发环境(IDE)的纯命令行工作流。当项目规模较小时,例如仅包含main.c、uart.c、timer.c等少数几个C源文…...
DeEAR语音情感识别保姆级教学:Python 3.11环境验证→模型加载→音频预处理全流程
DeEAR语音情感识别保姆级教学:Python 3.11环境验证→模型加载→音频预处理全流程 1. 引言:语音情感识别的价值与应用 你有没有想过,电脑不仅能听懂你说的话,还能理解你说话时的情绪?这就是语音情感识别技术的魅力。今…...
FlowState Lab实时交互生成效果:鼠标轨迹实时转化为波动动画
FlowState Lab实时交互生成效果:鼠标轨迹实时转化为波动动画 1. 效果亮点概览 想象一下,你在屏幕上随意移动鼠标,每一刻的轨迹都能瞬间变成流动的波纹、绽放的花朵或是跳动的音符。这就是FlowState Lab带来的实时交互体验——将你的每一个动…...
CVPR 2026 即插即用 | 卷积篇 | DEGConv:方向引导门控卷积,动态掩码强化结构区域,边缘/纹理/小目标结构全捕捉!
VX: shixiaodayyds,备注【即插即用】,添加即插即用模块交流群。 文章目录 模块出处 模块介绍 模块提出的动机(Motivation) 适用范围与模块效果 模块代码及使用方式 模块出处 Paper:MixerCSeg: An Efficient Mixer Architecture for Crack Segmentation via Decoupled Mamb…...
Qwen3.5-9B作品集:支持红外热成像图+可见光图双模输入的工业设备诊断
Qwen3.5-9B作品集:支持红外热成像图可见光图双模输入的工业设备诊断 1. 模型核心能力展示 Qwen3.5-9B作为新一代多模态大模型,在工业设备诊断领域展现出独特优势。该模型能够同时处理红外热成像图和可见光图像,为设备状态监测提供双重验证。…...
OpenClaw日志分析:GLM-4.7-Flash任务执行统计与优化机会挖掘
OpenClaw日志分析:GLM-4.7-Flash任务执行统计与优化机会挖掘 1. 为什么需要关注OpenClaw的日志分析 上周我的OpenClaw助手突然"罢工"了——连续三个夜间自动化任务失败,却没有任何明显错误提示。当我手动翻查~/.openclaw/logs目录下那些密密…...
