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

Go与Rust的对比与分析

Rust 和 Go 是两种现代语言,近年来获得了巨大的关注,每种语言都有自己独特的优势和权衡。在这篇文章中,我们将深入探讨 Rust 和 Go 之间的差异,重点关注性能、语言功能和其他关键因素,以帮助您针对您的开发需求做出明智的决定。

2023 年,我们有一千个学习 Rust 的理由。

8 月 7 日,Rust 基金会发布了2022 年 Rust 调查报告结果。报告显示,Rust 的采用率持续增加。超过 90% 的受访者表示他们是 Rust 用户;Rust 用于大部分编码工作,比前一年大幅增长 51.8%。

毫无疑问,Rust凭借其出色的内存安全性和并发性能,越来越成为开发者关注的焦点。不过,也很难忽视Go这个曾经被选为年度编程语言的相对“老牌”选手。

Go语言诞生于2009年,因其独特的并发模型和强大的性能优势,从一开始就受到了极大的关注。值得注意的是,和Rust语言一样,Go语言的创造者也“讨厌”C++,而Go也是云原生的主导语言。

在 Stack Overflow 2022 开发者调查中,在“一种让人又爱又恨的编程语言”这个问题的 7 万份回复中,程序员显然更喜欢 Rust,其中 86% 的人表示喜欢 Rust,64% 的人表示喜欢 Go。面对Rust的火爆状态,一些开发者扪心自问:2023年Go还值得学习吗?

另外,这两天,到底选择 Rust 还是 Go 也成为 Hacker News 上的热门话题:

不得不说,Go 和 Rust 绝对都是优秀的编程语言。它们现代、强大、多功能,并提供出色的性能。但直接比较 Go 和 Rust 确实没有意义,哪个更好,因为每种编程语言背后都代表着一系列深层的权衡。不同的语言会针对不同的需求进行优化,所以我们在选择语言的时候,也应该考虑我们想要用它来解决什么样的问题。所以我们将从Go和Rust语言的适用场景出发,讨论Go和Rust的设计之“道”。

虽然 Rust 和 Go 在语法和风格上有很大差异,但两者都是构建软件的一流工具。下面我们开始具体分析。

Go 与 Rust:相似之处

Rust 和 Go 有很多共同点,这就是人们经常比较两者的原因。他们有什么共同目标?

Rust 是一种低级静态类型多范式编程语言,更注重安全性和性能。

和:

Go 是一种开源编程语言,可以轻松构建简单、可靠且高效的软件。

内存安全

Go 和 Rust 都是非常重视内存安全的现代编程语言。在 C 和 C++ 等古老语言的几十年里,我们已经清楚地认识到,错误和 bug 的核心原因之一是对内存的不安全/不正确访问。

所以Rust和Go各自给出了不同的解决方案,但两者的目标都是在内存管理方面更加智能、安全,帮助开发者编写出性能优异的正确程序。

快速、紧凑的可执行文件

两者都是编译语言,这意味着程序可以直接翻译成可执行的机器代码,从而可以将程序部署为单个二进制文件。与 Python 和 Ruby 等解释性语言不同,我们不需要随程序附带解释器和大量库/依赖项。作为这一核心优势的直接体现,Rust 和 Go 程序往往比解释性语言运行得更快。

通用语言

Rust 和 Go 都是功能强大且可扩展的通用编程语言,可用于开发各种现代软件 - 从 Web 应用程序到分布式微服务,再到嵌入式微控制器和移动应用程序等等。

两者都拥有优秀的标准库和蓬勃发展的第三方生态系统,再加上强大的商业支持和庞大的用户群。两者都已存在多年,并将在未来几年继续蓬勃发展。如今,学习 Go 或 Rust 将是一项非常合理的时间和精力投资。

务实的编程风格

它们既不是过度函数式语言(例如 Scala 或 Elixir),也不是完全面向对象的语言(例如 Java 和 C#)。相反,Go和Rust虽然都具有函数式和面向对象的编程功能,但它们始终强调一种务实的导向——即以最合适的方式解决问题,而不是通过“意识形态”强迫大家按照特定的方式做事。 ”。

但如果你真的喜欢函数式编程风格,Rust 方面还有更多相关的工具选项,这也是 Rust 相对于 Go 的优势之一。

我们当然可以争论什么是真正的“面向对象”语言。但公平地说,C++、Java 或 C# 用户所期望的面向对象编程风格在 Go 或 Rust 中并不真正存在。

大规模开发

Rust 和 Go 都为大规模编程提供了许多有用的功能,因此它们都可以适应大型开发团队和大型代码库的实际需求。

例如,C 程序员多年来一直在争论如何放置括号,以及代码是否应该使用制表符或空格缩进;但Rust和Go已经使用标准格式化工具(Go有gofmt,Rust有rustfmt)完全解决了这些问题。它们会自动使用一致的样式重写您的代码。

并不是说这种特殊的格式很微妙,而是 Rust 和 Go 程序员更加务实,更喜欢统一的实现标准。

gofmt的风格无人喜欢,但gofmt却是所有人的最爱。

这两种语言的另一大优势体现在构建管道上。两者都具有优秀的、内置的、高性能的标准构建和依赖管理工具。这意味着程序员不必与复杂的第三方构建系统抗衡,也不需要每隔几年就学习一个新系统。

Rust 还是 Go?

说了这么多问题,而且两种语言都设计得这么好,功能也这么强大,那么这次比赛有什么结果吗?或者,既然两者都是很好的选择,为什么人们仍然在社交媒体上感到愤怒,写长篇评论博客文章说“Rust 是白痴的”或“Go 根本不是一种编程语言”之类的刺耳的话?

当然,有些人只是想发泄情绪,但这显然无助于解决实际问题。至少当涉及到在项目中使用哪种语言,或者使用哪种语言闯入编程世界时,大声的声音显然无助于做出正确的选择。

让我们回到大人的讨论中,看看Rust和Go在理性分析下有何优缺点。

Go 与 Rust:性能

如前所述,Go 和 Rust 生成的程序都很快,因为它们无需经过解释器或虚拟机即可编译为本机机器代码。

但Rust的性能仍然更好,甚至可以与被誉为业界性能基准的C和C++相媲美。而且与这些老式语言不同的是,Rust 还提供了内存安全和并发安全机制,同时几乎不影响执行速度。Rust 还允许开发人员构建复杂的抽象,而不会在运行时造成性能损失。

相比之下,虽然 Go 程序性能良好,但它们的设计重点是开发速度(包括编译)而不是执行。Go程序员更喜欢清晰易读的代码,因此运行速度会慢一些。

Go 编译器也不会花费太多时间生成最高效的机器代码,它更关心快速编译大量代码。因此,在运行时基准测试中,Rust 程序常常击败 Go 程序。

Rust 的运行时性能也非常一致且可预测,因为它不使用垃圾收集。Go 的垃圾收集器非常高效,并且经过优化以尽可能缩短暂停时间(Go 的每个新版本的暂停时间都会变短)。但无论如何,垃圾收集总是会在程序的行为方式中引入一些不可预测性,这对于某些应用程序(例如嵌入式系统)来说可能是严重的甚至是完全不可接受的。

简单

如果一种编程语言太难学习并且将大多数人拒之门外,那么它的功能有多么强大也无济于事。Go 似乎是故意设计的,以将其与 C++ 等日益复杂的语言区分开来:它的语法非常少,关键字非常少,甚至函数也很少。

这意味着Go语言很容易学习,稍微了解一下就可以用它来编写各种程序。

这里的关键是“简单”二字。当然,简单并不意味着容易。但小而简单的语言肯定比大而复杂的语言更容易学习。实现一种效果的方法并不多,因此高质量的 Go 代码几乎总是看起来相同。这样做还有另一个好处:我们可以快速了解我们不熟悉的服务在做什么。

Go的核心本体很小,但是标准库却很强大。也就是说,除了 Go 语法之外,我们的学习曲线还必须考虑标准库的这一部分。

另一方面,将功能从语言转移到标准库意味着大家只需要专注于学习与当前开发需求相关的库即可。

Go在设计上还充分考虑了大规模软件开发的需求,能够强有力地支持大型代码库和开发团队。在这种场景下,新开发人员必须能够快速上手。为此,Go 社区始终优先考虑程序的简单性、清晰性、多功能性和直接性。

Go 是我使用过的最高效的语言之一。口头禅是:今天就解决实际问题。

功能

Rust 比其他几种编程语言支持更多的复杂性,因此相应的实现范围也更大。

Rust 经过专门设计,包含各种强大且有用的功能,帮助程序员用更少的代码做更多的事情。例如,Rust 的 match 函数使得快速编写灵活且富有表现力的逻辑成为可能:

但也因为Rust的设计考虑较多,所以学习起来比较困难,尤其是在初级阶段。不过没关系,C++ 或 Java 毕竟有很多东西要学,而且它甚至不提供 Rust 的内存安全等高级功能。

所以批评 Rust 过于复杂的声音确实没有道理:它的设计就是为了强调表现力和丰富的功能,我们不能期望它在享受好处的同时又如此简单纯粹。

所以 Rust 当然有它自己的学习曲线。但只要克服了这个困难,前面的路就会平坦。

Rust 与 C++ 和 D 争夺程序员的心智份额,这些程序员准备接受更复杂的语法和语义(可能还有更高的可读性成本),以换取最大可能的性能。

虽然 Rust 和 Go 互相借用了一些功能(例如泛型),但可以公平地说 Rust 的功能比 Go 的更好。

并发性

大多数语言都提供某种形式的并发编程支持(即同时执行多个操作),但 Go 是为此而设计的。Go 不使用操作系统线程,而是提供了一种轻量级替代方案:goroutines。

每个 goroutine 都是一个独立执行的 Go 函数,Go 调度程序将其映射到受控制的操作系统线程之一。也就是说,调度程序可以非常有效地管理大量并发 goroutine,同时仅使用有限数量的操作系统线程。

因此,我们可以在单个程序中运行数百万个并发 goroutine,而不必担心严重的性能问题。正因为如此,Go 是针对 Web 服务器和微服务等大规模并发应用场景的完整解决方案。

Go 还为 goroutine 提供通道,这是一种快速、安全、高效的通信和共享数据的方式。Go的并发设计水平确实很高,使用体验相当轻松愉快。

总的来说,并发程序的设计是非常困难的,用任何语言构建可靠、正确的并发程序绝非易事。不过,由于在项目之初就考虑到了这个需求,Go 中的并发编程机制已经做得尽可能简单,并且集成得很好。

Go 使得构建一个精心分解的应用程序变得非常容易,该应用程序在部署为一组微服务时充分利用并发性。

Rust 也可以做这些事情,但可以说它更难一些。在某些方面,Rust 对防止与内存相关的安全漏洞的痴迷意味着程序员必须不遗余力地执行在其他语言(包括 Go)中更简单的任务

相比之下,Rust中的并发机制才刚刚落地,尚未稳定下来,所以欢迎大家继续关注这个活跃的发展方向。这也是有好处的。例如,Rust的rayon库提供了一种非常优雅且轻量级的方法,可以将顺序计算转换为并行计算。

虽然在 Rust 中实现并发程序可能并不容易,但它仍然是完全可行的,并且这些程序也受益于 Rust 精心设计的内存安全保证。

以标准库的 Mutex 类为例:在 Go 中,我们可能会在访问某些东西之前忘记获取互斥锁;但在 Rust 方面,我们完全不必担心。

Go 将并发作为首要概念。这并不是说您无法在 Rust 中找到 Go 面向参与者的并发性的各个方面,而是将其留给程序员作为练习。

安全

如前所述,Go 和 Rust 都有自己的方法来防止各种常见的编程错误,尤其是与内存管理相关的问题。但Rust更进了一步,可以说是不遗余力地保证大家不犯意想不到的安全错误。

也就是说,Rust 的编程体验与几乎任何其他语言都不同,并且在首次引入时可能非常具有挑战性。但在很多开发者看来,这种努力显然是值得的。

包括 Go 在内的许多语言也提供了帮助程序员避免错误的工具,但 Rust 将这种效果提升到了一个新的水平。许多不正确的程序甚至根本无法编译。

Rust 与 Go:差异

虽然 Rust 和 Go 都是流行且广泛使用的现代语言,但它们并不是真正的竞争对手,因为它们可以解决截然不同的用例。

Go 的整个编程方法与 Rust 完全不同,这些特性特别适合某些人,但也可能完全激怒其他人。这是有道理的,因为如果 Rust 和 Go 都以基本相似的方式解决基本相同的问题,为什么我们需要两种不同的语言?

那么,我们是否可以从 Rust 和 Go 的做法入手,解读它们各自的本质呢?我们一起来尝试一下吧。

垃圾收集

“垃圾收集,还是不垃圾收集”始终是一个没有正确答案的问题。总的来说,垃圾收集和自动内存管理可以帮助我们快速、轻松地开发可靠、高效的程序。所以对于一些开发者来说,这些都是必不可少的功能。

其他人则认为,垃圾收集及其性能开销和全局暂停可能会导致不可预测的运行时行为并引入不可接受的延迟。当然,这种说法是有道理的。

接近硬件

计算机编程的历史可以说是一个日益复杂的抽象发展过程。它允许程序员解决问题而无需过多关注底层硬件的实际运行方式。

这种设计使得程序更容易编写并且更可移植。但对于其他程序来说,访问硬件和精确控制程序的执行方式更为重要。

Rust的目标是让程序员“靠近硬件”,重新获得更多的控制权;而 Go 则抽象了架构细节,让程序员能够更接近问题。

Golang 擅长编写微服务和典型的“DevOps”任务,但它不是一种系统编程语言。Rust 对于并发性、安全性和/或性能很重要的任务来说更强大;但它的学习曲线比 Go 更陡峭。

性能至上

事实上,对于大多数程序来说,性能不如代码可读性重要。但是,如果某些项目确实将性能放在第一位,那么 Rust 中的许多设计权衡将帮助您将代码的执行速度一路推向极限。

相比之下,Go 更关心代码的简单性,甚至愿意为此牺牲一些运行时性能。但 Go 的构建速度是无与伦比的,这对于大型代码项目来说往往更为重要。

Rust 的执行速度比 Go 更快。在基准测试中,Rust 确实更快,在某些情况下快了一个数量级。但在选择 Rust 之前,请明确一点:Go 在大多数基准测试中并没有落后太多,而且相对于 Java、C#、JavaScript 和 Python 等语言,它仍然保持着性能优势。

如果您需要一流的性能,请选择这两种语言中的任何一种,速度性能永远不会令人失望。另外,如果你正在构建一个处理高强度负载的Web服务,并且需要灵活的垂直/水平缩放,两种语言也都可以满足需求。

正确性

另一方面,如果你不强迫程序永远不会出错,那么权衡就会不同。大多数代码并不是为长期使用而设计的,但有些程序确实可以在生产环境中运行多年。

面对这些现实,可能值得投入一点额外的时间来开发并确保程序正确可靠地工作,而不会在未来带来沉重的维护负担。

Go 和 Rust 都可以帮助您编写正确的程序,但方式不同:Go 提供了出色的内置测试框架,而 Rust 则专注于通过借用检查器消除运行时错误。

明天要发布的代码,用Go;如果是未来五年必须保持稳定的代码,那就选择Rust。

虽然 Go 和 Rust 对于严肃的开发项目来说都足够好,但最好充分了解它们的各种功能和优势。

简而言之,其他人的想法并不重要:只有您可以决定哪种编程语言更适合您的团队和项目需求。

总结

希望这篇文章能帮助您了解 Rust 和 Go 各自的亮点。如果可能的话,你最好稍微体验一下这两种语言,因为它们在任何技术路径上都非常有用,即使对于业余编程爱好者来说也是如此。

但如果你只有时间认真学习一门语言,请务必弄清楚 Go 和 Rust 各自的专长和倾向后再做选择。

当然,编程语言知识只是成功软件工程师的一小部分。除了编程之外,工程师还必须精通设计、工程、架构、沟通和协作。只要每个人都能做好以下几件事,无论你选择哪种编程语言,你都将成为一名优秀的软件工程大师。

相关文章:

Go与Rust的对比与分析

Rust 和 Go 是两种现代语言,近年来获得了巨大的关注,每种语言都有自己独特的优势和权衡。在这篇文章中,我们将深入探讨 Rust 和 Go 之间的差异,重点关注性能、语言功能和其他关键因素,以帮助您针对您的开发需求做出明智…...

SpingMVC拦截器-异常处理的思路,用户体验不好的地方

1、异常处理机制 1.1 原先我们的异常都是手动的try..catch() 2、他存在着一些缺陷:这里创建了一个Demo的controller,内部有一个show方法: 3、访问内部,我要实现demoshow方法,我们来调用show1和show2的方法: 4、有一…...

【C++设计模式】用动画片《少年骇客》(Ben10)来解释策略模式

2023年8月25日&#xff0c;周五上午 今天上午学习设计模式中的策略模式时&#xff0c;发现这个有点像很多卡通片里面的变身器... #include<iostream>//alien hero是外星英雄的意思 //在《少年骇客》中&#xff0c;主角可以通过变身器变成10种外星英雄 class AlienHero{ …...

软件测试及数据分析处理实训室建设方案

一 、系统概述 软件测试及数据分析处理是软件开发过程中的一项重要测试活动&#xff0c;旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作&#xff0c;以实现整个软件系统的功能和性能。以下是软件测试及数据分析处理的一…...

切换Debian的crontab的nano编辑器

Debian的crontab默认的编辑器是nano&#xff0c;用起来很不习惯,怎么才能转回vim呢? 用以下命令便可&#xff1a; #update-alternatives --config editor 出现以下所示的界面&#xff1a; 而后选择8使用/usr/bin/vim就能够了。 PS&#xff1a;若是你发现你的定时没有生效&…...

Spring Cloud Alibaba-Sentinel--服务容错

1 高并发带来的问题 在微服务架构中&#xff0c;我们将业务拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff0c;但是由于网络 原因或者自身的原因&#xff0c;服务并不能保证服务的100%可用&#xff0c;如果单个服务出现问题&#xff0c;调用这个服务就会出…...

Stable Diffusion 系列教程 | 如何获得更高清优质的AI绘画

目录 1 高清修复 1.1 原理 1.2 基本操作 1.3 优缺点 2 UpScale 放大脚本 2.1 原理 2.2 基本操作 2.3 优缺点 3 附加功能放大 3.1 原理 3.2 基本操作 3.3 优缺点 优化出图质量&#xff0c;产出更高清&#xff0c;分辨率更高&#xff0c;更有细节的绘画作品呢&#x…...

食品饮料制造行业如何实现数字化转型和工业4.0

随着科技的不断进步和全球产业的不断发展&#xff0c;食品饮料制造行业也正迎来数字化转型和工业4.0的浪潮。这一转型不仅提升了生产效率和质量&#xff0c;还满足了消费者对更健康、更可持续产品的需求。本文将深入探讨食品饮料制造行业在数字化转型和工业4.0方面的趋势、挑战…...

UE学习记录03----UE5.2 使用MVVM示例

1.打开ue5.2新建C项目 2.项目中通过类导向新建C类&#xff0c;父类选择为UMVVMViewModelBase&#xff0c;创建完成会自动打开vs 3.在VS中对新建的类进行宏定义 使用 C 类向导 创建的类声明自动通过 UCLASS() 宏进行处理。 UCLASS() 宏使得引擎意识到这个类的存在&#xff0c;并…...

代码审计-审计工具介绍-DAST+SAST+IAST项目

DASTSASTIAST项目介绍 DAST&#xff1a; 动态应用程序安全测试&#xff08;Dynamic Application Security Testing&#xff09;技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击&#xff0c;分析应用程序的反应&#xff0c;从而确定该We…...

网络安全应急响应预案培训

应急响应预案的培训是为了更好地应对网络突发状况&#xff0c;实施演 练计划所做的每一项工作&#xff0c;其培训过程主要针对应急预案涉及的相 关内容进行培训学习。做好应急预案的培训工作能使各级人员明确 自身职责&#xff0c;是做好应急响应工作的基础与前提。应急响应…...

STM32F4X 定时器中断

STM32F4X 定时器中断 什么是定时器STM32F4X 定时器分类有关定时器的概念预分频(PSC)自动重装载值(ARR) STM32F4X定时器例程定时器相关函数定时器例程 什么是定时器 定时器(Timer)最基本的功能就是定时&#xff0c;比如定时翻转LED灯&#xff0c;定时向串口发送数据等。除此之外…...

MongoDB +Dataframe+excel透视表

读取MongoDB中的表 from pymongo import MongoClient import pandas as pd client MongoClient(IP地址, 27017)db client[AOI] collection db[表名] #替换为实际的名称 document collection.find({time:{$gte:2023-08-15 15:26:06}})#筛选数据 df pd.DataFrame(list(docu…...

PostgreSQL日期相关

PostgreSQL日期相关 PostgreSQL日期相减得到整数 PostgreSQL日期相减得到整数 天数相减得到整数&#xff0c;执行下面的SQL&#xff1a; select to_number(date_trunc(day,2023-08-18 00:00:00::TIMESTAMP - 2023-08-10 00:00:00::TIMESTAMP INTERVAL 1 day)::text, 9999999…...

C++编程法则365天一天一条(8)const_cast去除cv限定

文章目录 1、使用场景2、关于const_cast的陷阱3、总结const_cast主要用于去除cv限定,且在C++提供的4个类型转换运算符里,只有const_cast可以去除或者添加cv属性。 1、使用场景 用法如下: const_cast< target-type >( expression ) 两个可能是多级指针且指向相同类型…...

某网站DES加密逆向分析实战

文章目录 一、抓包分析二、加密分析一、重写加密 一、抓包分析 分析站点&#xff1a; aHR0cDovL2VpcC5jaGFuZmluZS5jb20v 首先我们提交一下登陆信息&#xff1a; 搜索j_password查看加密函数: 把上图搜索到的encryptPassword函数拿出来分析一下&#xff1a; function encryptP…...

面向对象的理解

想要对象了&#xff1f;没问题&#xff0c;new一个就好了。 但是&#xff0c;new太多对象&#xff0c;对象也会生气的哦。 你瞧&#xff0c;她来了 从两段代码发现端倪 我们来计算一个矩形的面积&#xff0c;看看这两段代码有什么区别呢&#xff1f; 第一段&#xff1a; con…...

java ssl加密发送邮件

通过25端口发送邮件不安全&#xff0c;改为ssl加密方式发送邮件&#xff0c;比较常见的2中实现类发送邮件如下所示。 1、JavaMailSenderImpl 类 使用该实现类发送邮件&#xff0c;ssl加密使用端口号为465&#xff0c;借助Properties类设置ssl的各种配置。 SysUserEntity user…...

SpringBoot-yml配置文件的使用与优势

目录 一、什么是yml配置文件&#xff1f; 二、如何在SpringBoot中使用yml配置文件&#xff1f; 三、如何在SpringBoot中注入yml配置文件的属性&#xff1f; Value注解 ConfigurationProperties注解 四、yml配置文件与properties配置文件的区别和优势 区别 优势 五、总结…...

Layer Normalization(层规范化)

详细内容在这篇论文&#xff1a;Layer Normalization 训练深度神经网络需要大量的计算&#xff0c;减少计算时间的一个有效方法是规范化神经元的活动&#xff0c;例如批量规范化BN&#xff08;batch normalization&#xff09;技术&#xff0c;然而&#xff0c;批量规范化对小批…...

redisson参数配置

文章目录 pom配置链接配置建议 pom <!-- 引入spring-data-redis组件 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><!-- 因springboot2.x…...

【基于Arduino的仿生蚂蚁机器人】

【基于Arduino的仿生蚂蚁机器人】 1. 概述2. Arduino六足位移台–蚂蚁机器人3D模型3. 3D 打印零件4. 组装Arduino六足位移台5. Arduino蚂蚁机器人电路图6. 为Arduino Hexapod设计PCB7. 组装电路板8. 系统代码9. Arduino蚂蚁机器人安卓应用程序在本教程中,我将向您展示如何构建…...

angular12里面FormGroup做多个项目的相关check

FromFroup在鼠标失去焦点时做相关check&#xff0c;可以在group方法第二个参数的位置加一个对象参数 { validator: this.checkPasswords } 在Angular 12中&#xff0c;可以使用formGroup来进行两个密码是否一致的检查。以下是一个示例&#xff1a; 首先&#xff0c;在组件的…...

TypeScript 的发展与基本语法

目录 一、为什么什么是TypeScript&#xff1f; 1、发展历史 2、typescript与javascript 3、静态类型的好处 二、基础语法 1、基础数据类型 2、补充类型 3、泛型 4、泛型的高级语法 5、类型别名&类型断言 6、字符串/数字 字面量 三、高级类型 1、联合/交叉类型…...

macOS - 上编译运行 risc-v (spike)

文章目录 一、说明二、安装步骤三、测试 一、说明 本文根据以下文章改编&#xff1a; RISC-V 环境配置 https://decaf-lang.github.io/minidecaf-tutorial/docs/step0/riscv_env.html 相关链接&#xff1a; riscv-gnu-toolchain GNU toolchain for RISC-V, including GCC ht…...

Linux--线程地址空间

1.程序地址空间 先来就看这张图 这是一张程序地址分布的图&#xff0c;通过一段代码来证明地址空间的分布情况 编译结果&#xff1a; 可以看出的是&#xff0c;父子进程中对于同一个变量打印的地址是一样的&#xff0c;这是因为子进程以父进程为模板&#xff0c;因为都没有对数…...

华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、备注说明五、二分查找六、解题思路七、Java算法源码八、效果展示1、输入2、输出3、说明 一、题目描述 按照环保公司要求&#xff0c;小明需要在沙化严重的地区进行植树防沙工作&#xff0c;初步目标是种植一条直线的树带。 由于…...

RNN+LSTM正弦sin信号预测 完整代码数据视频教程

视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…...

如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态

背景 流程图需要支持只读状态和编辑状态 翻看官方案例源码&#xff0c;扒拉到了禁用的js代码 DisableModeling.js const TOGGLE_MODE_EVENT toggleMode const HIGH_PRIORITY 10001export default function DisableModeling(eventBus,contextPad,dragging,directEditing,e…...

字节跳动 Git 的正确使用姿势与最佳实践

版本控制Git 黑马&尚硅谷 Git的前世今生 方向介绍 为什么要学习Git 1.0 Git是什么 1.1 版本控制 1.1.1 本地版本控制 1.1.2 集中版本控制 1.1.3 分布式版本控制 我们已经把三个不同的版本控制系统介绍完了&#xff0c;Git 作为分布式版本控制工具&#xff0c; 虽然目前来讲…...

龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP

1. 描述 LT7911UX是一种高性能的Type-C/DP1.4a到MIPI或LVDS芯片。HDCP RX作为HDCP中继器的上游端&#xff0c;可以与其他芯片的HDCP TX协同工作&#xff0c;实现中继器的功能。 对于DP1.4a输入&#xff0c;LT7911UX可以配置为1/2/4车道。自适应均衡使其适用于长电缆应用&#…...

Spearman Footrule距离

Spearman Footrule距离是一种用于衡量两个排列之间差异的指标。它衡量了将一个排列变换为另一个排列所需的操作步骤&#xff0c;其中每个操作步骤都是交换相邻元素。具体而言&#xff0c;Spearman Footrule距离是每个元素在两个排列中的排名差的绝对值之和。 这个指标的名字中…...

docker 安装 Wordpress 用lnmp搭建出现的故障

第一个故障就是mysql出现的故障了 你起mysql镜像是这么起的导致pid号用不了 docker run --namemysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp 解决方法 docker run --namemysql -d --privilege…...

【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…...

【Spring框架】Spring事务的介绍与使用方法

⚠️ 再提醒一次&#xff1a;Spring 本身并不实现事务&#xff0c;Spring事务 的本质还是底层数据库对事务的支持。你的程序是否支持事务首先取决于数据库 &#xff0c;比如使用 MySQL 的话&#xff0c;如果你选择的是 innodb 引擎&#xff0c;那么恭喜你&#xff0c;是可以支持…...

七夕特别篇 | 浪漫的Bug

文章目录 前言一、迷失的爱情漩涡&#xff08;多线程中的错误同步&#xff09;1.1 Bug 背景1.2 Bug 分析1.3 Bug 解决 二、心形积分之恋&#xff08;心形面积计算中的数值积分误差&#xff09;1.1 Bug 背景1.1.1 背景1.1.2 数学模型 1.2 Bug 分析1.2.1 初始代码1.2.2 代码工作流…...

数据结构双向链表

Hello&#xff0c;好久不见&#xff0c;今天我们讲链表的双向链表&#xff0c;这是一个很厉害的链表&#xff0c;带头双向且循环&#xff0c;学了这个链表&#xff0c;你会发现顺序表的头插头删不再是一个麻烦问题&#xff0c;单链表的尾插尾删也变得简单起来了&#xff0c;那废…...

解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案

政务行业是国家治理的重要组成部分&#xff0c;涉及到国家安全、社会稳定、民生福祉等方面。随着信息技术的快速发展和革新&#xff0c;政务信息化也迎来了新一轮的升级浪潮。国家相继出台了《国家信息化发展战略纲要》《“十三五”国家信息化规划》《“十四五”推进国家政务信…...

redis 7高级篇1 redis的单线程与多线程

一 redis单线程与多线程 1.1 redis单线程&多线程 1.redis的单线程 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理…...

GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程

目录标题 一、Buffered Channels and Worker Pools1. Goroutine and Channel Example 线程和通道示例2. Deadlock 死锁3. Closing buffered channels 关闭通道4. Length vs Capacity 长度和容量5. WaitGroup6. Worker Pool Implementation 线程池 二、Select1. Example2. Defau…...

vue ui 创建项目没有反应

问题 cmd中输入 vue ui 没有反应 解决办法 vue ui命令需要vue3.0以上的版本才可以 1、查看当前版本 vue --version vue版本在3.0以下是没有ui命令的 2、查看版本所拥有的命令 vue -h 3、卸载之前版本的vue npm uninstall vue-cli -g 卸载完成&#xff0c;检查是否已经…...

go语言中channel类型

目录 一、什么是channel 二、为什么要有channel 三、channel操作使用 初始化 操作 单向channel 双向channel&#xff0c;可读可写 四、close下什么场景会出现panic 五、总结 一、什么是channel Channels are a typed conduit through which you can send and receive …...

基于STM32F1的电子罗盘HMC5883L角度测量

基于STM32F1的电子罗盘HMC5883L角度测量 参考 1. HMC5883L模块 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Axqqv48y-1692885921487)(…\img\HMC5883L.png)] 型号&#xff1a;GY-271使用芯片&#xff1a;HMCL5883L供电电源&#xff1a;3-5V通…...

Oracle解锁表、包、用户、杀会话、停job

Oracle解锁表、包、用户、杀会话、停job 一、创建包tzq_server_pkg二、授权给需要使用的用户log三、解锁表&#xff1a;执行存过unlock_table(schema_name, table_name)四、解锁包&#xff1a;执行存过unlock_package(schema_name, pkg_name)五、解锁用户&#xff1a;执行存过u…...

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用 一、相关知识点二、摘要三、正文四、总结一、相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构二、摘要 本文从一个行业MIS系统的开发实践,讨论了软件开发平台的选择和应…...

Redis Pub/Sub 指南

Redis 不仅仅是一个数据库&#xff0c;还可以作为支持发布和订阅&#xff08;Pub/Sub&#xff09;操作的消息代理。本文将使用 Navicat for Redis 简要概述 Redis 的 Pub/Sub 功能。 关于发布或订阅消息范式 Pub/Sub 是一种模式&#xff0c;发送者&#xff08;广播者&#xf…...

Nest(2):Nest 应用目录结构和脚手架命令介绍

Nest 应用目录结构和脚手架命令介绍 在正式使用 NestJS 进行开发之前&#xff0c;先来了解下 Nest 应用的目录结构&#xff0c;和一些常用的脚本命令。 工程目录 下面是使用 nest/cli 创建的 Nest 项目的目录结构。 上篇文章中介绍了 src 目录以及目录下各个文件的作用。下面…...

【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone® IV E EP4CE10E22I8LN,FPGA-现场可编程门阵列芯片

1、MKV31F512VLL12 微控制器 (MCU) 是适用于BLDC、PMSM和ACIM电机控制应用的高性能解决方案。这些MCU采用运行频率为100MHz/120MHz、带数字信号处理 (DSP) 和浮点单元 (FPU) 的ARM Cortex-M4内核。KV3x MCU配备两个采样率高达1.2MS/s的16位ADC、多个控制定时器以及512KB闪存。 …...

矢量调制分析基础

前言 本文介绍VSA 的矢量调制分析和数字调制分析测量能力。某些扫频调谐频谱分析仪也能通过使用另外的数字无线专用软件来提供数字调制分析。然而&#xff0c;VSA 通常在调制格式和解调算法配置等方面提供更大的测量灵活性&#xff0c;并提供更多的数据结果和轨迹轨迹显示。本…...

ensp-Ipv6配置配置

ensp-Ipv6配置配置 &#x1f4ce;ipv6.zip&#x1f4ce;Ipv6 网络.docx...