强行让Java和Go对比一波[持续更新2024-04-10已更新]

概述

很多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
逐步学习Go-集合(Arrays, Slices,Map,Set))
Java 数组int[] a = new int[5];
切片

var s []int)
逐步学习Go-集合(Arrays, Slices,Map,Set)

逐步学习Go-Slice(切片)还可以多挖一下 – 小厂程序员

List 接口实现类,如 ArrayListList<Integer> s = new ArrayList<>();
哈希表map[string]int
逐步学习Go-集合(Arrays, Slices,Map,Set))
Map 接口实现类,如 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) }
逐步学习Go-OOP编程
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: ... }
逐步学习Go-Select多路复用
N/A无直接对等,可使用 Selector 和 NIO
channelch := make(chan int, 1)
go channel可以认为是同步和队列,无缓冲为同步,有缓冲为队列。
逐步学习Go-并发通道chan(channel)
BlockingQueueBlockingQueue q = new ArrayBlockingQueue(1024);
协程(goroutine)go func(){println("hello world")}(), 轻量级线程,逐步学习Go-协程goroutineVirtual 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 逐步学习Go-OOP编程interface / classJava直接定义一个接口,一个class implements 接口,比如: class Person implements Human
sync.WaitGroup等待一组操作完成的同步原语
逐步学习Go-WaitGroup
学习链接2
CountDownLatch, CyclicBarrier,Semaphore
sync.Once整个应用声明周期中只执行一次
逐步学习Go-sync.Once(只执行一次)Exactly Once
AtomicBooleanJava中没有直接对应,但是根据sync.Once的底层实现,其实就是原子变量+锁来保证的,所以使用AtomicBoolean来对应是没有问题的
sync.Mutex互斥锁,个人感觉go的互斥锁算是Java Synchronized和ReentrantLock的一个综合体
逐步学习Go-sync.Mutex(详解与实战)
Synchronized, ReentrantLock
sync.RWMutex读写锁
逐步学习Go-sync.Mutex(详解与实战)
ReentrantReadWriteLock
切片动态数组
Go Slice【官方Wiki】
ArrayList

注意

一些Go中的特性在Java没有直接的对应,比如:Select和context,以及Go中没有VM的概念,但是Go也是自动垃圾回收。

参考

强行让Java和Go对比一波 – FOF编程网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 集合Collection

集合的体系 Collection的结构体系 List系列集合&#xff1a;添加的元素是有序的、可重复、有索引。Set系列集合&#xff1a;无序、不重复、无索引 HashSet&#xff1a;无序、不重复、无索引LinkedHashSet:有序、不重复、无索引TreeSet&#xff1a;按照大小默认升序排序、不重复…

VueRouter使用,界面切换

一、安装 vue-router3&#xff0c;4分别对应vue2&#xff0c;3.。我现在用的是vue2&#xff0c; npm install vue-router3二、使用 ①首先在component路径下提前写好需要渲染的组件。 ②在App.vue中使用router声明路由。其中router-link的to指明渲染哪一个组件。router-view…

类与对象\友元

最前面加上关键字 friend友元是单向的&#xff0c;不具有交换性 实现互访需要两个类都将对方声明为自己的友元类 友元关系不具备传递性使用友元可以避免频繁调用类的接口函数&#xff0c;提高效率&#xff0c;节省开销 3种形式 友元函数&#xff1a;不属于任何类的普通函数友…

SpringBoot项目在yml或者properties文件中使用环境变量

在 application.yml 或者 application.properties 值的位置随便写这样的语法就可以替换文本 ${MYSQL_URL:192.168.0.100}比如 datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://${MYSQL_URL:192.168.0.10…

​智己舆论战完败

阅读本文大概需要 1.41 分钟 智己汽车跟小米汽车双方在社交媒体上的交锋&#xff0c;想必大家这两天应该有所耳闻&#xff0c;具体情况是这样的&#xff1a;智己发布新车 L6&#xff0c;对标小米 SU7&#xff0c;其中有一项对小米 SU7 的参数标注错误。于是小米发文要求其道歉&…

cmd输出日期及格式

编写Windows批处理时经常会需要使用到日期和时间作为文件名&#xff0c;详解如下&#xff1a; 1.获取日期 格式&#xff1a; %date% 结果&#xff1a; 2022-07-31 2.获取时间 格式&#xff1a; %time% 结果&#xff1a; 10:21:21.68 3.获取日期和时间 格式&#xff1a;…

grid布局不确定x轴或者y轴具体有多少行,但是宽高是固定的

在CSS Grid布局中&#xff0c;即使你不确定x轴&#xff08;列&#xff09;或y轴&#xff08;行&#xff09;上具体有多少元素&#xff0c;你仍然可以通过设置固定的宽度和高度来定义网格。如果你想要创建一个固定宽高的网格&#xff0c;但不确定具体的行数或列数&#xff0c;你…

huggingface无法下载模型的问题解决

OpenDevin里面的embedding模型需要从huggingface下载&#xff0c;但是连不上&#xff0c;怎么办呢&#xff1f; 以前碰到连不上&#xff0c;就放弃了&#xff0c;所以很长时间没有用过huggingface。这回OpenDevin这个软件太牛了&#xff0c;激励着我把这个这个问题解决。 从网…

从零开始学Spring Boot系列-SpringApplication

SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下&#xff0c; 你只需委托给 SpringApplication.run这个静态方法 &#xff1a; SpringBootApplicationpublic class SpringbootLearningApplication {public static void main(String[] args) …

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …

HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议&#xff0c;它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响&#xff0c;并探讨它们在现代Web…

docker重启错误-重启命令一直卡住

docker重启错误-重启命令一直卡住 systemctl restart docker 卡住 未知原因&#xff1a;可能是启动的容器数量过多&#xff0c;或者磁盘IO问题 解决方式&#xff1a; systemctl start docker-cleanup.service systemctl start docker Docker是一种相对使用较简单的容器&#…

蓝桥杯每日一题:扫雷(Flood Fill)

题目描述&#xff1a; 扫雷是一种计算机游戏&#xff0c;在 2020 世纪 8080 年代开始流行&#xff0c;并且仍然包含在某些版本的 Microsoft Windows 操作系统中。 在这个问题中&#xff0c;你正在一个矩形网格上玩扫雷游戏。 最初网格内的所有单元格都呈未打开状态。 其中 …

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…

基于java+springboot+vue实现的图书管理系统(文末源码+Lw)23-259

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;图书信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

数据结构之查找的总结

一、线性表的查找 ①、顺序查找之二分查找 int BinSearch(RecType R[], int n, KeyType k) {int low 0, high n - 1, mid;while(low < high){mid (low high) / 2;if(k R[mid].key)return mid 1;if(k < R[mid].key)high mid - 1;elselow mid 1;} return 0; }

嵌入式ARM版本银河麒麟操作系统V10SP1安装OPenGauss数据库

前言&#xff1a; 官网提供了非常完整的openGauss安装步骤。 https://opengauss.org/zh/download/archive/列举一下个人的使用环境&#xff1a; 麒麟V10 rk3588工控板&#xff08;ARM&#xff09; openGauss-3.0.5&#xff08;极简版&#xff09;浏览一下官网&#xff0c;可以…

JavaScript核心语法及数据类型详解

JavaScript是一种广泛应用于Web开发的脚本语言&#xff0c;它具有丰富的核心语法和数据类型。本文将重点回顾JavaScript的核心语法和数据类型。 JavaScript的核心语法 变量声明和赋值 在JavaScript中&#xff0c;可以使用var、let、const关键字来声明变量。 var是ES5中的变…

一网统管/安防监控/视频综合管理EasyCVR视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&a…

代码随想录--数组--二分查找

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 举一个字符数组的例子&#xff0c;如图所示&#xff1a; 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的。 正是因为数…