go与java

UE5 C++开发:告别手动配置,构建自动化第三方库管理插件 在C++项目开发中,依赖管理是构建系统设计的核心环节,其原理在于通过模块化封装,将外部库的编译、链接和部署逻辑自动化。这种技术价值在于显著提升开发效率、保障构建一致性,并降低团队协作成本。尤其在游戏开发、音视频处理等需要集成复杂第三方组件的应用场景中,手动配置头文件路径和库文件极易出错。本文聚焦于虚幻引擎5(UE5)开发,详细解析如何通过创建独立的插件模块,实现动态库的自动化集成与平台适配,从而将开发者从繁琐的配置工作中解放出来,专注于核心逻辑实现。 阅读详情

到今天我使用java语言11多年多了,java伴随我开发了很多服务器项目,伴随我开发过android,对于java我有比较深厚的感情。我开始关注go是在2017年,那时我就职于某广告公司,公司的竞价系统因为需要高并发使用go开发。

从2018年开始创业,因为java非常熟悉,市场上java程序员非常多,方便招聘,首选java开发,从2018下半年开始,毅然决然新的项目使用go开发,是什么原因让我下定决心呢?

java的运行原理很简单,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用。后续android为了提升速度出了其他的字节码文件,和虚拟机不在本次讨论范围
java的前身是1992开发的Oak语言,1996年1月发布JDK 1.0,1999年4月发布HotSpot虚拟机,HotSpot成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机

go发布于2009年,可以说java是20世纪的产物,go是21世纪的产物。跨世纪了[惊!]。

切换

我2008年在学习java的时候还是个学生,是有c和c++基础的(vc写过计算机,读取手机短信这种水平)。 用了3个月的时间才大致弄明白java做的事情。 弄明白了各种关键字作用,和面向对象的机制。实际去企业开发的时候还是会遇到各种问题。而限制使用范围的关键字也只用public和private。很少用连续的继承。
2018年我带着团队学习使用go的时候,只用2周时间大家就都掌握了,能填充代码开发了。 如果你是一个java程序员,从java到go的距离只有2周时间

开发
// java
@RestController
@RequestMapping(value = "/xx")
public class LotteryController {

    @RequestMapping(value = "/xx1", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
    public String xXXX1(HttpServletRequest httpRequest) {
        return "success";
    }
    @RequestMapping(value = "/xx2", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
    public String xXXX2(HttpServletRequest httpRequest) {
        return "success";
    }
}

使用iris框架写个post方法

// go
// 启动文件
app.Post("/xx/xx1", controller.Xxxx1)
app.Post("/xx/xx2", controller.Xxxx2)
// --------------------------------------
// 具体文件中方法实现
func Xxxx1(ctx context.Context) {
	ctx.Text("success")
}
func Xxxx2(ctx context.Context) {
	ctx.Text("success")
}

这个简单的例子可以看出 可以看出java spring的方法是注解在实现类中的,go是通过写在代码中的更方便。而且所有入口在一个文件中更方便查找。
对于杠精来说可以不用spring注解,使用spring配置文件,或者servlet。。。。
在处理IO时java用try catch finally,finally中还得分开try catch 关闭。我早就忍不了,我都怀疑强迫症的人会无限的写下去。。。
java启个线程

new Thread(new Runnable() {
            @Override
            public void run() {
      		// do         
            }
        }).start();

而go的语法就精简很多了,启动个协程运行,只要在掉用的时候加关键字go。

通过代码我们可以看出go的代码非常精简

运行

go的协程设计确实更适合高并发,java开一个线程就对应于一个系统线程。go开一个协程不对应一个系统线程。一个系统线程内存消耗一般2M,而协程只需要2k。1k个线程是2G内存。2G的内存能放多少协程啊

go的runtime与用户代码一起打包成可执行文件,java的代码需要依赖于虚拟机,open jdk 8的jre有100多Mb呢。

go的协程没有那么神秘,可以说实现的很简单。使用G-P-M模型
G:Goroutine用于存储运行堆栈、状态和任务函数可复用,需要绑定到P才能被掉用,Goroutine会排队等待执行。
P:Processor逻辑处理器,提供执行环境,内存分配状态,Goroutine队列等。P的数量由用户设置的GoMAXPROCS决定,最大数256,P的数量决定了并行执行G队列的数量。物理CPU核数 >= P的数量
M:Machine 系统内核线程的抽象,代表真正执行的计算资源,在绑定有效的P之后,进入schedule循环,schedule循环机制是P的G队列中获取要被执行的G,M的数量由Go RunTime调整,M不保留G的状态,这样G在推出M之后,下次可能由其他的M执行
Sched:Go调度器。负责维护G的总队列,和P中存在的G队列和状态信息,创建M,清理回收M等工作

性能测试
是骡子是马拉出来溜溜
使用ab命令压测同一台机器(2C4G 操作是根据id查询数据库中的一条记录) 请求次数100000 线程数150,为了避免干扰启动go服务的时候关闭java服务,反之亦然。

java环境: spring boot 2.2.5 + mybatis 3.5.3 hikari连接池 连接数200
tomcat设置:JAVA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m"

java第一次
在这里插入图片描述
java第二次
在这里插入图片描述
java第三次
在这里插入图片描述
java第四次
在这里插入图片描述
java第五次
在这里插入图片描述
java的统计情况
在这里插入图片描述

go环境: iris v11.1.1 + gorm v1.9.10

go第一次
在这里插入图片描述

go第二次
在这里插入图片描述
go第三次
在这里插入图片描述
go第四次
在这里插入图片描述
go第五次
在这里插入图片描述

go的统计情况
在这里插入图片描述

说明 通过压测我们可以看出Java的第一次压测劣势非常明显,java是编译成class文件, 第一次执行需要通过虚拟机进行类加载,之后的执行可以用加载好的文件执行。所以我去掉java的第一次重新计算了一下平均值

java内存 :tomcat启动之前机器已使用内存是769M,启动之后是1.20G,压测时内存峰值1.35G,后面几次压测之后,内存回收,回到1.21G

go内存 :go启动之前机器已使用内存是768M,启动之后是775M, 压测时内存峰值804M,,内存回收,回到784M

数据项javago
总耗时平均22.36s20.77s
每秒处理数44744812
每条处理耗时33.55ms31.16ms
传输速率1044k/s1122k/s
压测过程中cpu使用率96%-99%96%-99%
启动内存占用459Mb7Mb
压测过程最高占用内存613Mb36Mb
执行结束后内存占用470Mb16Mb

性能测试部分go完胜

打包编译速度

我使用的是macOS cpu i5 内存 8G

go 编译linux下的包用时 <2s
java maven 打war包用时 20s

docker image

构建docker image 的大小与方便程度决定了上线部署的速度
为了测试都基于ubuntu镜像

数据项javago
最终镜像大小151M33.8M
操作步骤1 添加jre和tomcat
2设置环境变量
3添加war包
添加可执行文件
优化空间未知使用scratch基础镜像体积更小
2019 发生了什么

go发布了两个版本1.12 和1.13 ,从1.13开始我才觉得go能正常使用了。之前go的使用有些弊端,首先打包就是个麻烦事。1.13版本Go Modules 默认成为了Golang 官方版本原生的包管理方式,包管理问题算是画上了一个句号。
还有一件非常重要的大事,之前在国内使用某系包,都会收到墙的影响,大家都是使用github上的源代替官方源,2019go有了官方承认的代理https://goproxy.cn,引包不再成为问题。

java发布了jdk12

Shenandoah GC算法,没发布在openjdk中。G1优化1(可中断 mixed GC)G1优化2 (归还不使用的内存),可以看出官方还是想改进垃圾回收。毕竟靠垃圾回收优化养活了Zing悲哀不悲哀
2019 的双11 阿里90%的容器都使用了Wisp2,这个Wisp2的最重要的一点就是给java安上了协程。真是笑出眼泪。

后续

java的库非常全面,也很好用。java程序员非常好招聘。垃圾回收一致被大家诟病,java也一直在这方面努力。
go后发优势明显,不过在2019之前因为墙和包管理的问题,非常难用。go的轮子还没有造那么多。不过正在快速补充进来。

Golang与Java:现代软件开发的两大工具对比 在现代软件开发领域,选择合适的编程语言对于项目的成功至关重要。在众多编程语言中,Golang(Go)和Java作为两大重要工具备受关注。Golang由谷歌开发,于2009年首次发布,旨在提供一种简洁、高效的编程语言,尤其适用于并发编程。Java则由Sun Microsystems于上世纪90年代推出,以其跨平台性、面向对象特性和强大的生态系统闻名于世,成为企业应用和大型系统开发的首选语言之一。 阅读详情

相关推荐

SQLite → PostgreSQL 迁移脚本与踩坑清单

本文提供了SQLite迁移到PostgreSQL的两种可靠路径:首选使用pgloader工具自动转换schema和数据,支持类型映射和并行复制;备选方案通过sqlite3导出CSV再用PostgreSQL的COPY命令导入,适合需要自定义清洗的场景。重点介绍了数据类型映射规则、迁移步骤、校验方法和常见问题,包括自增主键、布尔值、时间类型等关键差异处理。迁移后需进行行数核对、哈希抽样等校验,并给出了性能优化建议。最后强调迁移不仅是数据转移,更需要同步升级数据模型和索引策略,根据业务场景选择合适的数据库方案。

aifs2025的博客 1886

Go和Java的异同

一、面向对象 1.Java是纯正的面向对象语言,Go相对于Java而言,就比较简洁,没有例如类的继承、接口的实现、构造函数和析构函数、隐藏的 this 指针等,也没有 public、protected、private 之类的访问修饰符。 2.类型系统 类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容: 基本类型,如 byte、int、bool、float、string 等; 复合类型,如数组、切片、字典、指针、结构体等; 可以指向任意对象的类型(Any 类型); 值语义和引用语义

qq_40229166的博客 7927

五大经典遥感数据集对比:LoveDA、Potsdam、Toronto、Vaihingen、Massachusetts Roads选哪个?

本文深度对比了LoveDA、Potsdam、Vaihingen、Toronto和Massachusetts Roads五大经典遥感数据集。针对城市监测、道路提取、土地分类等不同任务,从分辨率、标注质量、数据规模及场景多样性等核心维度进行分析,为研究者根据项目目标、硬件条件与应用场景选择最合适的遥感数据集提供决策指南。

weixin_29057065的博客 237

Java VS Go 还在纠结怎么选吗,(资深后端4000字带你深度对比)

Go的优点代码简洁性静态类型可编译成机器码直接运行天生多核并行垃圾收集跨平台且不依赖运行时环境简洁的泛型内置安全性缺点有限的库支持泛型不够完善灵活度没Java高(这个可算优点也可算缺点)Java的优点优秀的文档优秀的三方库多线程灵活性高平台独立性完善的语言特性垃圾回收JVM缺点垃圾回收效果不佳大量冗余的陈旧实现导致性能不佳代码的复杂性复杂的继承机制。...

weixin_70730532的博客 1万+

hive sql每个用户的累积访问次数

我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/23 6 U01 2017/2/22 4 要求使用SQL...

weixin_39150719的博客 3488

MaPLe: Multi-modal Prompt Learning

具体而言,我们在语言分支中附加可学习的上下文标记,并通过耦合函数显式地将视觉 Prompt 置于语言 Prompt 上,以建立它们之间的交互。使用 Prompt 来适应CLIP (语言或视觉) 的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。由此,提出了一种分支感知的多模态 Prompt,通过在两种模态之间共享提示来协调 CLIP 的视觉和语言分支。在 Prompt Tuning 中,必须采取多模态方法获得同时适应 CLIP 的视觉和语言分支,以实现上下文优化的完整性。

weixin_48907099的博客 1054

Java对比GO的优劣势

二次开发了微信三方管理平台的go项目后聊一下使用go后的一些感受

qq_35040959的博客 4405

武汉理工大学 python实验三

请编一个程序,用户在同一行内输入两个整数,代表头和脚的数量,编程计算笼中各有多少只鸡和兔(假设鸡和兔都正常,无残疾),如无解则输出`“Data Error!题目为:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?年前,《孙子算经》中记载一个有趣的问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,已知共有。编写一个宝塔上的琉璃灯的小程序,计算并输出每层各有多少盏琉璃灯。,如果有多个解,则分行输出,每行一个解;

2401_83472225的博客 5950

GO开篇:手握Java走进Golang的世界

Go简介、Go和Java的对比

健身变秃,coding变强 1万+

23、资产分散化与有效前沿:投资组合优化的核心策略

本文深入探讨了现代投资组合理论的核心概念,包括分散投资的重要性、均值-方差优化框架以及有效前沿的构建与应用。通过案例分析和数学模型,阐述了如何通过科学方法降低投资组合风险并实现最优风险收益权衡。文章还介绍了实际应用中的求解方法与决策流程,为投资者提供系统的投资组合优化指导。

cc789的博客 116

需要Perfetto分析的anr

anr类的问题,经常会有系统cpu,内存负载不高,iowait也不高,主线程状正常的,这类问题通过常规的日志无法分析,需要抓取Perfetto来分析应用的情况。event log中也没有异常。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 63

从Java到Go:Java工程师的Golang学习指南

作为一名Java工程师,你可能已经习惯了Java的面向对象编程、强大的生态系统以及丰富的工具链。然而,随着Go语言(Golang)在云计算、微服务和并发编程领域的崛起,学习Go语言成为了一个非常有价值的选择。本文将通过对比Java和Go语言的方式,帮助你快速掌握Go语言的核心概念,并通过详细的案例讲解,帮助你理解两者之间的异同。 Go 对比: Go 对比: Go 对比: Go 对比:Java通过类和接口实现多线程编程,或者使用包中的高级并发工具。 Go Go语言通过实现并发,是轻量级的线程,由Go运

SunnyRivers 1754

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3872

Java Spring Boot 与 Go(Golang)

随着后端框架的不断发展,开发人员面临着在项目中选择还是**Go (Golang)**的关键问题。这两个框架都功能强大,但适用于不同的用例。本文提供了详细的比较,并提供了技术基准、实际示例和用例场景,帮助开发人员做出明智的选择。

qq_28791753的博客 3972

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

go java 并发_golang百万并发-golang的并发性真的比Java高吗

使用了两种语言,但没有开发相同的业务。 然而,在目前的业务下,GO性能已经得到了具体的测试,而不会太担心GO性能,据说即将到来的GO1、5将再次提高性能太多。 其实还是很喜欢GO语言,简单,实用,并且适合大规模并发。 围棋学习阈值低于java。 如果担心gc影响实时,也可以申请大量内存做自己的内存管理。也许JavaGC更好,去不够。去并发比较好,Java达到同样效果,回调写死。真的很想知道,只是考...

weixin_26874745的博客 666

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

go java 对比_Golang与JAVA比较

普通用法比较函数func swap(x, y string) (string, string) {var a int = 100return y, x}a, b := swap("Mahesh", "Kumar")go的方法需要加func入参类型在参数后面,返回类型在入参后面定义类型在变量的后面返回值可以是多个参数函数定义后可作为值来使用java 中的null go中的nilgo中的数组var ...

weixin_36413157的博客 1199

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

go java性能_golang编程语言和java的性能对比

这篇文章主要介绍了golang、java性能的对比,需要的朋友可以参考下!1.先说Go吧,因为我个人最近正在用,感觉很不错package mainimport "fmt"func main(){fmt.Println(fibonacci(34))}func fibonacci(i int) int{if(i<2){return i;}return fibonacci(i-2) + fibon...

weixin_32902659的博客 1806

golang和java_比较Go和Java的早期

golang和javaby Harshavardhana 通过Harshavardhana 比较Go和Java的早期 (Comparing early days of Go and Java) In the last 2 years Golang (or simply ‘Go’) has raised to the ranks of mainstream programming languag...

cumian9828的博客 516

golang调用java_Go调用Java的一个简单例子

2019独角兽企业重金招聘Python工程师标准>>> 由于Java世界里有非常丰富的开源应用模型和轮子,而这些正是Go世界里面最缺乏的东西,所以我首先考虑的就是如何在Go里面调用现有的Java代码。早上写了个简单的Go调用Java的例子,在winxp环境下能够正常运行。这段代码比较简单,就是在Go代码里面去call一个叫Hello的java对象。而这个Hello.java功能...

weixin_39991305的博客 2852

go语言与java_Golang与JAVA比较

普通用法比较函数func swap(x, y string) (string, string) {var a int = 100return y, x}a, b := swap("Mahesh", "Kumar")go的方法需要加func入参类型在参数后面,返回类型在入参后面定义类型在变量的后面返回值可以是多个参数函数定义后可作为值来使用java 中的null go中的nilgo中的数组var ...

weixin_35338620的博客 446

go java 并发_golang与java并发性能对比测试

测试环境:cpu:2.8 GHz 四核Intel Core i7内存:16 GB 1600 MHz DDR3jdk版本:1.8go版本:1.14测试方法:分别使用golang和java并发执行相同数量的空任务golang使用goroutine实现,代码如下:func main() {count,line := 100*10000,"---------------------------------...

weixin_42509548的博客 682

java客户端go服务端_Grpc Golang 客户端调用 Java 服务端

proto protobufsyntax = "proto3";// go 生成文件所在包option go_package = "proto";option java_multiple_files = true;// java 生成文件所在包option java_package = "com.bocloud.autorelease.hello";// java 生成文件类名称option ja...

weixin_30558657的博客 464

java 自动转 golang_基于dubbo-go的golang与java通信解决方案实践——伍:golang代码的生成...

golang代码生成方案为了更加贴合java开发的习惯,我自己开发了maven plugin,解析java代码并自动生成go代码,以及通过git submodule拉取golang的lib库,生成go代码后再推送至lib库上。golang代码的格式设计格式设计我按照java的开发习惯来,部分参考了protobuf的规定。单独一个服务的结构如下:golang代码结构其中dto为使用的数据结构,enu...

weixin_35510737的博客 649

golang杀死java_用Golang来保护Java程序-Go语言中文社区

#反编译带来的困扰对于一个开发给自己组织内部用的程序,我们是不怎么需要考虑程序被反编译的事情的,但是对于商业软件来说,这又显得有必要,毕竟国内软件行业的竞争还是非常的激烈,大家可以把竞争对手的程序搞过来反编译一下(至于怎么拿别人的程序我相信大家都已经很老手了),轻易的知道对手基于什么软件来做,或者能够比较容易知道实现原理,然后。。抄抄抄,换个名字,完事,一个全新的产品就出来了。对于Java来说...

weixin_42500279的博客 202
上一篇: linux定时任务
下一篇: mac go版本升级
RobertLee~~~~~~~~
博客等级 码龄18年 14粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值