当前位置: 首页 > news >正文

强行让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]intJava 数组int[] a = new int[5];
切片var s []intList 接口实现类,如 ArrayList
[学习链接](逐步学习Go-集合(Arrays, Slices,Map,Set))
List<Integer> s = new ArrayList<>();
哈希表map[string]intMap 接口实现类,如 HashMapMap<String, Integer> m = new HashMap<>();
字符串var str stringString 类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 和 rangefor i, v := range slice { ... }for-each 循环for (Type v : iterable) { ... }
select (多路复用)select { case <-ch1: ... case <-ch2: ... }
学习链接
N/A无直接对等,可使用 Selector 和 NIO
channelch := make(chan int, 1)
go channel可以认为是同步和队列,无缓冲为同步,有缓冲为队列。 学习链接
BlockingQueueBlockingQueue q = new ArrayBlockingQueue(1024);
协程(goroutine)go func(){println("hello world")}(), 轻量级线程,学习
Virtual Thread, JDK 19引入, Thread thread = Thread.startVirtualThread(() -> {
defer (延迟执行)defer fmt.Println("done")try-finallytry { ... } finally { System.out.println("done"); }
panic 和 recoverfunc() { 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);
上下文 Contextcontext 包无直接对等,可以创建自定义类或使用线程本地变量使用 ThreadLocal<T> 存储上下文相关数据
同步原语和锁sync 包中的 Mutex 和 WaitGroupjava.util.concurrent 包中的 Locks等ReentrantLock 和 CountDownLatch 类
定时器time.After 和 time.NewTickerjava.util.Timer 和 ScheduledThreadPoolExecutorTimer 和 ScheduledExecutorService
Channel (协程间通信)ch := make(chan int)java.util.concurrent 中的 BlockingQueueBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
调度器Go 语言运行时调度器Java 线程调度器(JVM运行时管理)JVM负责线程调度
网络轮询器net 包NIO 的 SelectorSelector selector = Selector.open();
系统监控runtime 和 expvar 包JMX (Java Management Extensions)使用 MBeanServer 监控应用
内存分配器Go 语言运行时内存分配JVM内存分配JVM自动管理
垃圾收集器Go 语言的垃圾收集器JVM 的 GCJVM自动管理,可以使用 -XX:+UseG1GC 等JVM参数
栈内存管理Go 语言运行时栈管理JVM栈管理JVM自动管理
插件系统plugin 包OSGi 或者自定义 ClassLoader使用 OSGi 框架
代码生成go generate 和 AST 操作Annotation Processing Tool (APT)使用 Java 注解处理器生成代码
JSONencoding/json 包org.json 或 Jackson 等库使用 Jackson 的 ObjectMapper
HTTPnet/http 包java.net.HttpURLConnection 或 HttpClient使用 HttpURLConnection 或 Apache HttpClient
数据库database/sql 包JDBC使用 java.sql.Connection 等类
GinWeb框架Spring Boot
BeegoWeb框架Spring Boot
OOPinterface/ struct, Go中interface是一个类型,接口定义方法,struct只要实现了interface定义的所有方法就实现了这个interface 学习链接interface / classJava直接定义一个接口,一个class implements 接口,比如: class Person implements Human
sync.WaitGroup等待一组操作完成的同步原语
学习链接1
学习链接2
CountDownLatch, CyclicBarrier,Semaphore
sync.Once整个应用声明周期中只执行一次
学习连接
AtomicBooleanJava中没有直接对应,但是根据sync.Once的底层实现,其实就是原子变量+锁来保证的,所以使用AtomicBoolean来对应是没有问题的
sync.MutexReentrantLock
sync.RWMutex读写锁ReentrantReadWriteLock

相关文章:

强行让Java和Go对比一波[持续更新]

概述 很多Java开发如果想转Golang的话&#xff0c;比较让Java开发蛋疼的第一是语法&#xff0c;第二是一些思想和设计哲学的Gap&#xff0c;所以我这儿强行整理一波Java和Golang的对比&#xff0c;但是由于GO和Java在很多方面都有不同的设计&#xff0c;所以这些对比的项可以更…...

理解七层网络协议

osi体系结构 上三路&#xff08;管数据&#xff09; 应用层 通过http等&#xff0c;把传输的格式&#xff0c;数据打包 处理网络应用。直接为端用户服务&#xff0c;提供各类应用过程的接口和用户接口。例如&#xff1a;HTTP、Tenlent、FTP、SMTP、NFS等。基于TCP的FTP、HTTP…...

网络协议——HTTP协议

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

八股面试——数据库——索引

索引的概念 B树的概念&#xff1a; 索引的作用 聚簇索引与非聚簇索引 聚簇索引就是主键值&#xff0c;在B树上&#xff0c;通过主键大小&#xff08;数据在B树叶子节点按主键顺序排序&#xff09;寻找对应的叶子节点&#xff0c;叶子节点保存的一整条记录。 非聚簇索引&#x…...

【二分查找】Leetcode 二分查找

题目解析 二分查找在数组有序可以使用&#xff0c;也可以在数组无序的时候使用&#xff08;只要数组中的一些规律适用于二分即可&#xff09; 704. 二分查找 算法讲解 当left > right的时候&#xff0c;我们循环结束&#xff0c;但是当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语言中&#xff0c;随机数的生成通常依赖于特定的库函数&#xff0c;最常用的是 <stdlib.h> 头文件中的 rand() 函数。以下是对随机数知识点的总结、举例和分析&#xff1a; 随机数知识点总结 1.随机数种子&#xff1a;rand() 函数生成的随机数是伪随机数&#xff0…...

网络应用层和传输层

网络中有很多协议这些协议的不同导致了分层这一现象&#xff0c;不同层的主要功能不一样。 应用层&#xff1a;应用程序。数据具体如何使用 传输层&#xff1a;关注起点和终点 网络层&#xff1a;关注路径规划 数据链路层&#xff1a;关注相邻节点的转发 物理层&#xff1…...

Vue3:优化-从响应式数据中获取纯数据

一、情景说明 我们知道&#xff0c;Vue3中&#xff0c;创建变量时&#xff0c;常用ref、reactive来包裹&#xff0c;这样&#xff0c;这个变量就是响应式数据 然而&#xff0c;有时候&#xff0c;我们只需要纯数据 例如&#xff0c;我们在调用后端接口的时候&#xff0c;我们只…...

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?

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

学习CSS Flexbox 玩flexboxfroggy flexboxfroggy1-24关详解

欢迎来到Flexbox Froggy&#xff0c;这是一个通过编写CSS代码来帮助Froggy和朋友的游戏! justify-content 和 align-items 是两个用于控制 CSS Flexbox 布局的属性。 justify-content&#xff1a;该属性用于控制 Flexbox 容器中子项目在主轴&#xff08;水平方向&#xff09;…...

springboot项目如何配置跨域?

在Spring Boot项目中配置跨域&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;主要是为了允许来自不同源&#xff08;不同的协议、域名或端口&#xff09;的前端应用能够访问后端API。Spring Boot提供了多种方式来配置跨域支持。 1. 使用CrossOrigin注…...

实现第一个动态链接库 游戏插件 成功在主程序中运行 dll 中定义的类

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

算法第三十九天-验证二叉树的前序序列化

验证二叉树的前序序列化 题目要求 解题思路 方法一&#xff1a;栈 栈的思路是「自底向上」的想法。下面要结合本题是「前序遍历」这个重要特点。 我们知道「前序遍历」是按照「根节点-左子树-右子树」的顺序遍历的&#xff0c;只有当根节点的所有左子树遍历完成之后&#xf…...

Rust---复合数据类型之字符串与切片(2)

目录 字符串操作删除 (Delete)连接 (Concatenate)字符串转义前情回顾: Rust—复合数据类型之字符串(1) 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型,分别是: pop(),remove(),truncate(),clear(),此外还有drain() 方法。 pop 方法:pop() 方法返回一个 O…...

iOS 应用内网络请求设置代理

主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用&#xff0c;我们可以通过界面来进行设定&#xff08;是否开启代理、服务端、端口&#xff09;&#xff0c;从而达到类似系统上的设定 具体链接参考&#xff1a;为 iOS 网络请求设置代理…...

什么是MariaDB

2024年4月6日&#xff0c;周六晚上 今晚在Debian12上安装mysql时&#xff0c;运行后却发现是MariaDB MariaDB是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。MariaDB由MySQL的原始开发者之一Michael "Monty&qu…...

【面试八股总结】传输控制协议TCP(三)

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 一、TCP拥塞控制⭐ 1. 慢启动 – Slow Start 慢启动是指TCP连接刚建立&#xff0c;一点一点地提速&#xff0c;试探一下网络的承受能力&#xff0c;以免直接扰乱了网络通道的秩序。 慢启动算法&#xff1a; 初始拥塞窗口…...

今年过去了多少天?(switch)

//今年已经过去了几天&#xff1f; #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;…...

提升团队工程交付能力,从“看见”工程活动和研发模式开始

作者&#xff1a;张裕、雅纯 理想中的研发团队应当具有以下特征&#xff1a; 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力&#xff0c;以便能够正确评估优先级&#xff0…...

前端学习之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表实现&#xff0c;实现有2个结构体hmap&#xff0c;bmap&#xff0c;map由若干个桶存储&#xff0c;每个桶存8个元素&#xff0c;使用链地址解决hash冲突 …...

设计模式:享元模式案例

让我们以游戏开发中的棋类游戏&#xff08;例如国际象棋&#xff09;为例来展示享元模式的代码实现。在这个例子中&#xff0c;棋子的类型是内部状态&#xff0c;而棋子的位置是外部状态。 Java 代码示例 import java.util.HashMap; import java.util.Map;// 享元接口 interf…...

pandas(day5)

一. 检测重复值 1.1 检测 data pd.read_csv("./teacher/订单数据.csv")检测行与行之前是否有重复值 data.drop_duplicates()检测 列是否有重复值出现&#xff0c; keep first 从前往后判定 &#xff0c; last是从后往前判定data.drop_duplicates(subset["产…...

如何注册midjourney账号

注册Midjourney账号比较简单&#xff0c;准备好上网工具&#xff0c;进入官网 Midjourney访问地址&#xff1a; https://www.midjourney.com/ 目前没有免费使用额度了&#xff0c;会员最低 10 美元/月&#xff0c;一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…...

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;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 演示 网上及各官方资料&#xff0c;基本是一个 proto 文件&#xff0c;而实际项目&#xff0c;大多是有层级结构的多 proto 文件形式&#xff0c;本篇文章 基于此诉求&#xff0c;构建一个使用多 proto 文件的 rust grpc 使用示例。 关于 grpc 的实现…...

【Linux】Linux64位环境下编译32位报错skipping incompatible的解决办法

本文首发于 ❄️慕雪的寒舍 问题 如题&#xff0c;当我尝试在wsl2的ubuntu中使用-m32选项编译32位程序的时候&#xff0c;出现了下面的两种报错 ❯ 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

题目链接 思路一&#xff1a;关系绑定快速深搜 分析&#xff1a;这里也就是说&#xff0c;a 后面只能是e&#xff0c;e 后面只能是 a 或 i&#xff0c;其他的都是如此&#xff0c;那么也就是说&#xff0c;任何一个字母&#xff0c;后面能跟的字母都是规定好了的。 首先&#x…...

余姚网站建设哪家好/seo网页优化公司

信号量信号量信号量的同步与互斥实现信号量与条件变量实现同步的区别&#xff1a;信号量的接口函数&#xff1a;信号量如何实现同步与互斥信号量实现同步信号量实现互斥使用信号量实现生产者与消费者模型(代码实现&#xff09;信号量 信号量的同步与互斥实现 作用&#xff1a…...

用ps切片做网站/淘宝培训

Ubuntu Linux系统环境变量配置文件&#xff1a; /etc/profile : 在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 /etc /environment : 在登录时操作系统使用的第二个文件,系统在读取你自己的profile前…...

郑州专业做淘宝直播网站/网络推广渠道

&period;NET Core RC2发布在即&#xff0c;我们试着用记事本编写一个ASP&period;NET Core RC2 MVC程序在.NET Core 1.0.0 RC2即将正式发布之际,我也应应景,针对RC2 Preview版本编写一个史上最简单的MVC应用.由于VS 2015目前尚不支持,VS Code的智能感知尚欠火候,所 ...L…...

长沙网站制作哪家好/关键词指数查询

表白网站搭建 手把手的教大家如何搭建一个自己的表白网站&#xff0c;想想将这个网页展现在大屏幕上面&#xff0c;是不是很拉风哈 如果要用云服务器的话&#xff0c;建议大家看看我的那个阿里云实战的文章&#xff0c;里面有具体的购买云服务器的方法&#xff0c;用上云服务器…...

网站优化怎样做/seo 专业

1&#xff1a;写在前面 页面传递的参数都是string&#xff0c;而在控制器中接收参数类型是不确定的&#xff0c;对于基础数据类型&#xff0c;springmvc已经提供了类型转换器&#xff0c;对于不支持的目标类型&#xff0c;例如日期类型&#xff0c;自定义的对象类型&#xff0…...