搜索
首页后端开发Golang我尝试了所有热门编程语言

在这篇文章中,我将尝试比较 GoLang、Zig 和 Rust。以及为什么 Rust 赢得了这次比较(对我来说)。

故事时间!

我用 GoLang、Zig 和 Rust 编写了 3 个项目。这些项目足够大,可以很好地了解语言基础、缺点以及语言、框架或生态系统是否存在问题。

提示:请随意跳转到 TLDR 部分以获得该死的答案。

Go语言

几个月前我开始构建开发者工具,最初使用 GoLang。

第一个是基本的数据库管理和迁移实用程序 (dbdaddy),我真的很喜欢使用 GoLang。

尽管这是我第一次尝试用 GoLang 构建比 Advent Of Code 和 10 亿行挑战问题更严重的东西,我很惊讶我花了不到一周的时间就精通了它 .

之字形

一直以来,我都在和 Zig 一起玩(没什么太严重的)。我听说 Redis 将其许可证更改为“技术上非开源”许可证。

我心想:在 zig 中构建一个新的开源 Redis 有多难?

I Tried Every Hot Programming Language

快进 2 个月后:该死。

“GbCache”背后的基本思想是基于 LRU 的内存缓存,但实际的事实来源是保存在磁盘上,以及诸如引起的特定键/值更改的通知以及分配给键的 TTL 之类的功能。

Zig 的明确性令人印象深刻,这使得它变得更加简单且更容易使用。

我从“如果明天要使用 HyperScale™,它能处理负载吗?”的角度启动了 GbCache

这个观点驱使我排除了 GoLang,因为如果我无法极其确定地推理内存分配,我将无法完全控制速度。

从这个角度做事是一次非常好的学习经历,因为突然你开始看到程序中所有可能崩溃、耗尽内存或可能成为瓶颈的点 -代码中的热路径.

由于 Zig 的明确,我确定了我在何时何地分配内存

但是... Zig 归根结底并不是一种记忆安全的语言,而我是一个技能问题与珠穆朗玛峰一样大的人。

进入铁锈

在过去 2 年里,我曾 3 次尝试并愤怒地退出 Rust。来自 JavaScript 背景,我们的 macbook m69 maxes 中有大量 GB 内存,我从来没有真正理解为什么 Rust 有这些规则,并且从炒作的角度来看待它可能是一个糟糕的角度.

尽管我多次愤怒地退出,Rust 仍然在我的脑海中,它奇怪的语​​法、令人沮丧的内存规则和令人难以置信的生命周期。

但是在写 Zig 时,有件事让我受到了打击...我已经在跟踪所有这些记忆规则和生命周期,但这是一种精神负担

我开始注意到 Zig 代码中的模式和样板,试图做 Rust 已经做的事情。

在为 SFS(SFW 名称 - “简单文件存储”)构建 CLI 客户端时,我决定再次尝试 Rust。

这一次,在翻阅这本生锈的书时,我开始感受到这一切的“原因”。

我喜欢 Rust 的最基本的一点是基于所有权和借用的记忆的心智模型

尽管这种拥有和引用的记忆模型是虚构的,但它是一种方便推理的心智模型,并且在我的头脑中产生的开销更少

与 C 和 Zig 等语言在您头脑中产生的经典心理记忆模型相反。 必须在脑海中跟踪各个内存分配及其生命周期吗?不用了,谢谢!

总长DR

Go语言

  • (就像你的 5 个月活跃用户会需要它一样)
  • 可靠
  • 愚蠢的简单,语言永远不会成为你和你的目标之间的障碍
  • 伟大的软件包生态系统

之字形

  • 速度极快
  • 愚蠢的简单

  • 速度极快
  • 可靠
  • 伟大的软件包生态系统

他们全部

  • 惊人的错误处理

如果你是一名日常普通的后端工程师,并且喜欢计算他们的冲刺性能,那么你最好的选择可能是GoLang

“但是我的公司不使用 GoLa——”
“离开公司,离开它,为工具使用正确的工作。离开公司。”

对我来说,GoLang 就像一场包办婚姻,你内心永远不会感到那种匆忙,但它永远不会让你失望,它是你的生死攸关的伴侣,你可以把你的一生都押在它上面它。

但是我的朋友,如果您正在寻找那种高峰,请继续阅读!

鲁斯特普兰

但是我想要那种冲动…我想要看到他们的眼睛语法时我的心就会爆炸…当我和他们在一起时,我想要感觉自己在天堂见鬼,当我不...

I Tried Every Hot Programming Language

让我们快速看一下 Rust 中多线程安全的示例。

use std::thread;

fn main() {
    let mut counter = Box::new(0); // 32-bit integer allocated on the heap
    let mut handles = vec![];

    for _ in 0..10 {
        let handle = thread::spawn(|| {
            *counter += 1; // trying to edit the value
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap(); // WAITING FOR ALL THE THREADS TO COMPLETE
    }

    println!("Result: {}", *counter);
}

我们有一个堆分配的值,并且有 10 个线程尝试独立修改它。

此代码不安全地访问计数器变量,因为所有线程都会尝试同时修改计数器。

在其他语言中,类似的代码会愉快地编译和运行。

如果您以前在多线程环境中工作过,您的第一个想法可能是使用“互斥体”来防止更新计数器变量时的竞争条件。

但是由于人为错误,在大型代码库中很容易错过这样的小事情。

Rust 甚至不允许这个程序编译。

由于所有权和借用规则,编译器将检测到您在 for 循环的第一次迭代中的第一个线程中可变地借用计数器...到目前为止还好...第二次迭代还想可变地并行借柜台? 不安全!引发编译时错误!!

出于变异/修改的目的而从其所有者处引用或“借用”值称为“可变借用”

use std::thread;

fn main() {
    let mut counter = Box::new(0); // 32-bit integer allocated on the heap
    let mut handles = vec![];

    for _ in 0..10 {
        let handle = thread::spawn(|| {
            *counter += 1; // trying to edit the value
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap(); // WAITING FOR ALL THE THREADS TO COMPLETE
    }

    println!("Result: {}", *counter);
}

在这种情况下,其他语言根本不会给你任何错误。检查正确性是你的责任,Rust 会阻止这种情况发生。

像这样在语言中传播的结构可以帮助你避免搬起石头砸自己的脚(经常)。

结论

这要看情况!

真的希望有一种语言能够答案,即使 GoLang 非常接近这个目标,它实际上取决于您的用例,最重要的是您的团队。

对我来说,与 Rust 合作很愉快(现在,谁知道呢......呵呵)

TigerBeetle 的人们在 Zig 上尝试了一次机会,他们对此很满意。

Primeagen 对 Zig 更满意。

对于 Jarred Sumner 来说,Zig 很好,他用 Zig 写了 Bun。

Mitchell Hashimoto(HashiCorp 背后的人)正在 Zig 中书写幽灵,这是一个速度极快的术语 —

.
.
.

等等...

以上是我尝试了所有热门编程语言的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
与GO接口键入断言和类型开关与GO接口键入断言和类型开关May 02, 2025 am 12:20 AM

Gohandlesinterfacesandtypeassertionseffectively,enhancingcodeflexibilityandrobustness.1)Typeassertionsallowruntimetypechecking,asseenwiththeShapeinterfaceandCircletype.2)Typeswitcheshandlemultipletypesefficiently,usefulforvariousshapesimplementingthe

使用errors.is和错误。使用errors.is和错误。May 02, 2025 am 12:11 AM

Go语言的错误处理通过errors.Is和errors.As函数变得更加灵活和可读。1.errors.Is用于检查错误是否与指定错误相同,适用于错误链的处理。2.errors.As不仅能检查错误类型,还能将错误转换为具体类型,方便提取错误信息。使用这些函数可以简化错误处理逻辑,但需注意错误链的正确传递和避免过度依赖以防代码复杂化。

在GO中进行性能调整:优化您的应用程序在GO中进行性能调整:优化您的应用程序May 02, 2025 am 12:06 AM

tomakegoapplicationsRunfasterandMorefly,useProflingTools,leverageConCurrency,andManageMoryfectily.1)usepprofforcpuorforcpuandmemoryproflingtoidentifybottlenecks.2)upitizegorizegoroutizegoroutinesandchannelstoparalletaparelalyizetasksandimproverperformance.3)

GO的未来:趋势和发展GO的未来:趋势和发展May 02, 2025 am 12:01 AM

go'sfutureisbrightwithtrendslikeMprikeMprikeTooling,仿制药,云 - 纳蒂维德象,performanceEnhancements,andwebassemblyIntegration,butchallengeSinclainSinClainSinClainSiNgeNingsImpliCityInsImplicityAndimimprovingingRornhandRornrorlling。

了解Goroutines:深入研究GO的并发了解Goroutines:深入研究GO的并发May 01, 2025 am 12:18 AM

goroutinesarefunctionsormethodsthatruncurranceingo,启用效率和灯威量。1)shememanagedbodo'sruntimemultimusingmultiplexing,允许千sstorunonfewerosthreads.2)goroutinessimproverentimensImproutinesImproutinesImproveranceThroutinesImproveranceThrountinesimproveranceThroundinesImproveranceThroughEasySytaskParallowalizationAndeff

了解GO中的初始功能:目的和用法了解GO中的初始功能:目的和用法May 01, 2025 am 12:16 AM

purposeoftheInitfunctionoIsistoInitializeVariables,setUpConfigurations,orperformneccesSetarySetupBeforEtheMainFunctionExeCutes.useInitby.UseInitby:1)placingitinyourcodetorunautoamenationally oneraty oneraty oneraty on inity in ofideShortAndAndAndAndForemain,2)keepitiTshortAntAndFocusedonSimImimpletasks,3)

了解GO界面:综合指南了解GO界面:综合指南May 01, 2025 am 12:13 AM

Gointerfacesaremethodsignaturesetsthattypesmustimplement,enablingpolymorphismwithoutinheritanceforcleaner,modularcode.Theyareimplicitlysatisfied,usefulforflexibleAPIsanddecoupling,butrequirecarefulusetoavoidruntimeerrorsandmaintaintypesafety.

从恐慌中恢复:何时以及如何使用recover()从恐慌中恢复:何时以及如何使用recover()May 01, 2025 am 12:04 AM

在Go中使用recover()函数可以从panic中恢复。具体方法是:1)在defer函数中使用recover()捕获panic,避免程序崩溃;2)记录详细的错误信息以便调试;3)根据具体情况决定是否恢复程序执行;4)谨慎使用,以免影响性能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),