强行让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;…...
提升团队工程交付能力,从“看见”工程活动和研发模式开始
作者:张裕、雅纯 理想中的研发团队应当具有以下特征: 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力,以便能够正确评估优先级࿰…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
