强行让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;…...
提升团队工程交付能力,从“看见”工程活动和研发模式开始
作者:张裕、雅纯 理想中的研发团队应当具有以下特征: 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力,以便能够正确评估优先级࿰…...
前端学习之DOM编程案例:全选反选案例
代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>全选反选</title> </head> <body><input type"checkbox" id"all">全选<ul><li><…...
golang map
1.底层实现 2.如何解决hash冲突 3.扩容机制 4.无序 5.非线程安全 6.不可寻址 runtime/map.go 1.底层实现 底层基于hash表实现,实现有2个结构体hmap,bmap,map由若干个桶存储,每个桶存8个元素,使用链地址解决hash冲突 …...
设计模式:享元模式案例
让我们以游戏开发中的棋类游戏(例如国际象棋)为例来展示享元模式的代码实现。在这个例子中,棋子的类型是内部状态,而棋子的位置是外部状态。 Java 代码示例 import java.util.HashMap; import java.util.Map;// 享元接口 interf…...
pandas(day5)
一. 检测重复值 1.1 检测 data pd.read_csv("./teacher/订单数据.csv")检测行与行之前是否有重复值 data.drop_duplicates()检测 列是否有重复值出现, keep first 从前往后判定 , last是从后往前判定data.drop_duplicates(subset["产…...
如何注册midjourney账号
注册Midjourney账号比较简单,准备好上网工具,进入官网 Midjourney访问地址: https://www.midjourney.com/ 目前没有免费使用额度了,会员最低 10 美元/月,一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…...
探索数据结构:特殊的双向队列
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…...
16_I2C库函数
I2C库函数 1.void I2C_DeInit(I2C_TypeDef* I2Cx);2.void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);3.void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);4.void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);5.void I2C_DMACmd(I2C_Type…...
十八、Rust gRPC 多 proto 演示
十八、Rust gRPC 多 proto 演示 网上及各官方资料,基本是一个 proto 文件,而实际项目,大多是有层级结构的多 proto 文件形式,本篇文章 基于此诉求,构建一个使用多 proto 文件的 rust grpc 使用示例。 关于 grpc 的实现…...
【Linux】Linux64位环境下编译32位报错skipping incompatible的解决办法
本文首发于 ❄️慕雪的寒舍 问题 如题,当我尝试在wsl2的ubuntu中使用-m32选项编译32位程序的时候,出现了下面的两种报错 ❯ g -m32 test.cpp -o test1 && ./test1 In file included from test.cpp:1: /usr/include/stdio.h:27:10: fatal error…...
vue指令v-model
<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>vue指令v-model</title> </head>…...
怎么做祝福的网站/青岛自动seo
题目链接 思路一:关系绑定快速深搜 分析:这里也就是说,a 后面只能是e,e 后面只能是 a 或 i,其他的都是如此,那么也就是说,任何一个字母,后面能跟的字母都是规定好了的。 首先&#x…...
余姚网站建设哪家好/seo网页优化公司
信号量信号量信号量的同步与互斥实现信号量与条件变量实现同步的区别:信号量的接口函数:信号量如何实现同步与互斥信号量实现同步信号量实现互斥使用信号量实现生产者与消费者模型(代码实现)信号量 信号量的同步与互斥实现 作用:…...
用ps切片做网站/淘宝培训
Ubuntu Linux系统环境变量配置文件: /etc/profile : 在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 /etc /environment : 在登录时操作系统使用的第二个文件,系统在读取你自己的profile前…...
郑州专业做淘宝直播网站/网络推广渠道
.NET Core RC2发布在即,我们试着用记事本编写一个ASP.NET Core RC2 MVC程序在.NET Core 1.0.0 RC2即将正式发布之际,我也应应景,针对RC2 Preview版本编写一个史上最简单的MVC应用.由于VS 2015目前尚不支持,VS Code的智能感知尚欠火候,所 ...L…...
长沙网站制作哪家好/关键词指数查询
表白网站搭建 手把手的教大家如何搭建一个自己的表白网站,想想将这个网页展现在大屏幕上面,是不是很拉风哈 如果要用云服务器的话,建议大家看看我的那个阿里云实战的文章,里面有具体的购买云服务器的方法,用上云服务器…...
网站优化怎样做/seo 专业
1:写在前面 页面传递的参数都是string,而在控制器中接收参数类型是不确定的,对于基础数据类型,springmvc已经提供了类型转换器,对于不支持的目标类型,例如日期类型,自定义的对象类型࿰…...