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

为什么使用Golang而非Rust开发桌面应用?

MoonGuard 团队选择 Golang 而不是 Rust 作为他们的 Krater 桌面应用程序,因为 Golang 中更容易进行内存管理、类型安全和 ORM 支持。

使用 Rust 和 Tauri 时面临的一些挑战包括:

  • 难以理解 Rust 的所有权和借用规则、
  • 其严格的类型安全有时会限制开发速度、
  • 难以为 SQLite 找到合适的 ORM,
  • 以及测试非常复杂。

项目进行到大约 65% 时,团队仍在努力完成需要 Rust 代码的剩余功能。但是使用 Wails 迁移到 Golang 使他们能够在一个周末内移植几乎所有的进展。

Golang 的垃圾收集、用于并发的 Goroutines、更简单的静态类型、GORM ORM 的可用性以及由于其年龄而更大的生态系统比 Rust 更适合该项目。

这个桌面应用Krater 是一个跨平台应用程序,用于在本地调试 Laravel 应用程序。Krater 的诞生是因为我们作为开发人员需要一个定制工具,为 Laravel 应用程序或 PHP 项目提供更好的(本地)调试体验。

Krater 的目标是:

  • 数据持久性:我们希望数据在编程会话之间持久存在,甚至存储来自多个项目的数据。
  • 性能:我们希望 Krater 非常快,并在处理数据时避免内存崩溃。
  • 磁盘使用:Krater 应该是轻量级的并且占用很少的磁盘空间。目前,它的大小约为 18 MB。
  • 内存使用情况:我们不希望 Krater 在从 Laravel 接收到大量数据后或在窗口上显示多条记录时挂起。

在团队中,我们有使用 Electron 的经验,但我们事先知道它不会为我们提供开发 Krater 时所寻求的便利。我们认识到,使用 Electron,我们将无法实现 Krater 的性能、磁盘使用和内存目标。因此,Electron从一开始就被排除在外。

从可用的选项中,我们选择了 Wails 和 Tauri,原因如下:

  • 基于网络技术。
  • 与前端无关(允许我们使用 React、Vue、Svelte 等)。
  • 它们满足 Krater 的性能、持久性和效率目标。

在尝试了这两项测试后,我们认为这两种技术都是有效的,最终决定由 Tauri 做出,因为它有更好的支持、维护和在 Github 上的贡献。

我们都没有使用过 Rust 的经验,这也是我们第一次接触 Tauri。作为一个团队,我们接受了学习 Rust 和 Tauri 来开发应用程序的挑战。

Krater 的开发在前几个月进展缓慢,但到了第三个月,我们开始对语言实现功能有了更好的节奏和理解。随着时间的推移,我们提高了步伐,直到到达十字路口。

使用Rust遭遇的问题和挑战:

  • 了解所有权转移和管理可能是 Rust 最令人困惑和复杂的方面之一。考虑程序的执行流程并管理内存中的可变和不可变变量至关重要,以避免迷失在代码中。掌握这一点以及使用线程是团队最耗时的任务之一。
  • Rust 是一种具有很强类型安全性的语言,它可以充当未知格式数据的屏障,并确保编译器的代码安全。在代码中提出解决方案时,这种严格的功能有时会让人感到不舒服。我们经常听到这样的建议:开始以简单、扁平的方式编写代码,然后以更好的方式构建代码。这方面有时会限制我们的开发并消耗时间,让我们怀疑 Krater 作为一个应用程序是否需要这种级别的安全限制。
  • 在这个项目中,我们使用 SQLite 作为数据库,找到一个好的 ORM 是一项艰巨的任务。我们尝试了各种各样的库,但没有一个让我们满意。当时最稳定的选择是Diesel;然而,它不符合我们的需求,我们也相信文档可以做得更好。

Rust和Go比较:

  • Golang 和 Rust 处理内存的方式不同。Golang 使用自动垃圾收集来限制与内存泄漏相关的问题。它的管理是在运行时完成的,这可能会带来一定的额外成本。然而,Golang 提供了 Goroutines,它允许函数作为线程运行,从而使并发变得更容易。
  • Golang 和 Rust 都提供类型安全,但 Golang 是静态类型的,并使用垃圾收集器来管理内存(如前所述)。与 Rust 相比,Golang 的类型系统更简单。
  • Go的 GORM是一个非常好的 ORM 库。我们用它来定义表、运行迁移、删除记录以及执行许多其他操作。它有包含许多示例的全面文档。
  • Golang 比 Rust 早了几年,这体现在其社区的规模和成熟度,以及库文档和资源的广度和深度。一路走来,我们发现 Wails 的文档也很有帮助,还有一些书籍作为团队的学习材料。
  • 在 Golang 中编写单元测试更简单、更容易。Golang 通过包提供了对单元测试的内置支持 testing 。我们还能够为代码中的一些对象验证和创建模拟行为。

经过这几个月的开发,我们成功开发了 Krater 100% 并达到了第一个稳定版本。我们对使用这两个框架以及我们今年在开发该产品中获得的经验感到非常满意。

网友评论:

  • ORM 很有用,但也有局限性。当语言没有本地查询结构时,ORM 才会显现出来。
  • ORM 对于包含和封装嵌套对象是值得的。对结果集中关联的 SQL 支持还需要改进。直接 SQL 依然重要。
  • 我一直认为数据库才是真理的源泉,而不是 ORM 数据模型。
  • 了解 SQL 有时是开始使用 ORM 某些高级功能的先决条件。
  • Rust 有所取舍。Rust 将权衡明确化,这意味着你经常需要做出在其他语言中不必担心的决定。我的印象是,维持这种'简单'的表面现象是在暗地里制造一些恶魔。

https://www.jdon.com/69652.html

相关文章:

为什么使用Golang而非Rust开发桌面应用?

MoonGuard 团队选择 Golang 而不是 Rust 作为他们的 Krater 桌面应用程序,因为 Golang 中更容易进行内存管理、类型安全和 ORM 支持。 使用 Rust 和 Tauri 时面临的一些挑战包括: 难以理解 Rust 的所有权和借用规则、其严格的类型安全有时会限制开发速…...

问题复盘|MySQL 数据记录中明明有值,使用 concat() 后得到的却一直是 null

背景 MySQL 的数据数据记录中明明有值,在使用 concat() 查询时却一直得到 null SELECT CONCAT(first_name, , last_name) FROM users;排查后发现 MySQL 的 concat 函数拼接规则是 当多个拼接的字段的字段值中存在 null 时,返回的一定是 null 解决方…...

正点原子嵌入式linux驱动开发——Linux IIO驱动

工业场合里面也有大量的模拟量和数字量之间的转换,也就是常说的ADC和DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发,传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等,这些传感器本…...

利用角色roles上线wordpress项目

角色订制:roles ① 简介 对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。   roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文…...

4.0 Linux进程前导知识

个人主页:Lei宝啊 愿所有美好如期而遇 冯.诺依曼体系 CPU:运算器,控制器 输入设备:键盘,麦克风,摄像头,鼠标,网卡,磁盘等。 输出设备:显示器&#xff0…...

推荐一份适合所有人做的副业,尤其是程序员。

我建议每个人都去尝试一下网上接单,这是一个门槛低、类型多样的方式,尤其适合程序员! 在接单平台上,你可以看到各种类型的兼职。以freelancer为例,你可以在这里找到技术、设计、写作等类型的兼职,只要发挥…...

Linux中字符设备的打开、写入

一个内核模块应该由以下几部分组成。 第一部分&#xff0c;头文件部分。一般的内核模块&#xff0c;都需要 include 下面两个头文件&#xff1a; #include <linux/module.h> #include <linux/init.h> 第二部分&#xff0c;定义一些函数&#xff0c;用于处理内核…...

3d max软件中的缓存垃圾该如何清理?

使用3d max建模到渲染操作&#xff0c;来回对效果图调整的次数过多时&#xff0c;就会出现一下看不到的垃圾缓存&#xff0c;影响保存的速度&#xff0c;影响效率&#xff01; 对于这类的3d垃圾清理的有什么高效方法呢&#xff1f; 3dmax垃圾清理的常规操作如下&#xff1a; 1、…...

11.13 牛客刷题8/10

11.13 信号完整性 指针地址 的加减&#xff0c;注意 最后转为16进制...

CI/CD简介

CI/CD简介 1、CI/CD流水线2、什么是CI/CD3、CI/CD的优点4、CI/CD的工作原理5、CI/CD流水线工具6、CI/CD的应用7、CI/CD的未来趋势 1、CI/CD流水线 从最初的瀑布模型&#xff0c;到后来的敏捷开发&#xff0c;再到今天的DevOps&#xff0c;这是现代开发人员构建出色产品的技术路…...

python opencv 读取文件夹下所有MP4文件并解析成jpg图像

你可以使用Python的OpenCV库来读取文件夹中的所有MP4文件&#xff0c;并将其解析为JPG图像。以下是一个示例代码&#xff0c;演示了如何实现这个功能&#xff0c;并设置解析间隔为3帧&#xff1a; import os import cv2def extract_frames(input_folder, output_folder, inter…...

MySQL binlog 日志解析后的exec_time导致表示什么时间?

1. exec_time 到底表示什么时间&#xff1f; MySQL binlog日志解析后&#xff0c;我们能看到会有 exec_time &#xff0c;从字面意思理解这个记录的是执行时间&#xff0c;那这个记录的到底是单条sql的执行时间&#xff1f;还是事务的执行时间&#xff1f;下面通过测试来解读一…...

【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退

&#x1f3af;添加⽂件–场景⼀ &#x1f3af;在包含.git的⽬录下新建⼀个ReadMe⽂件&#xff0c;我们可以使⽤ git add 命令可以将⽂件添加到暂存区&#xff1a; • 添加⼀个或多个⽂件到暂存区&#xff1a; git add [file1] [file2] … • 添加指定⽬录到暂存区&#xff0c;…...

Django 基于ORM的CURD、外键关联,请求的生命周期

文章目录 基于ORM进行的CURDORM外键关联Django请求的生命周期流程图 基于ORM进行的CURD 本质上就是通过面向对象的方式&#xff0c;对数据库的数据进行增、删、改、查。 这里将会将我们之前所有内容结合到一起&#xff0c;首先确保基于上序操作已经建立好了UserInfo表&#xff…...

集合贴4——QA机器人设计与优化

基础课21——知识库管理-CSDN博客文章浏览阅读342次&#xff0c;点赞6次&#xff0c;收藏2次。知识库中有什么信息内容&#xff0c;决定了智能客服机器人在回答时可以调用哪些信息内容&#xff0c;甚至可以更简单地理解为这是智能客服机器人的话术库。https://blog.csdn.net/22…...

【Verilog语法】

Verilog语法 1. Verilog语法1.1 拼接运算符1.2 运算符优先级1.3 注释1.4 关键字1.5 模块结构1.6 结构语句1.7 赋值语句1.8 条件语句1.9 状态机1.10 OSI七层模型 1. Verilog语法 1.1 拼接运算符 1.2 运算符优先级 1.3 注释 1.4 关键字 1.5 模块结构 1.6 结构语句 1.7 赋值语句 …...

阿里云通用算力型u1服务器和e实例有什么区别?选择攻略

阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别&#xff1f;如何选择&#xff1f;ECS经济型e实例是共享型云服务器&#xff0c;通用算力型u实例是企业级独享型云服务器&#xff0c;e实例性价比高&#xff0c;现在2核2G3M带宽一年99元&#xff0c;云服务器u1价格相对要…...

modbus-TCP协议详解

modbus-TCP协议详解 1996年施耐德公司推出基于以太网TCP/IP的modbus协议&#xff1a;modbus-TCP。 MODBUS-TCP使MODBUS-RTU协议运行于以太网&#xff0c;MODBUS-TCP使用TCP/IP以太网在站点间传送MODBUS报文&#xff0c;MODBUS-TCP结合了以太网物理网络和网络标准TCP/IP以及以…...

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录 书籍推荐正则抓取腾讯动漫数据Flask展示数据 书籍推荐 如果你对Python网络爬虫感兴趣&#xff0c;强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧&#xff0c;是每位爬虫开发者的必读之作。详细介绍见&#x1f44…...

gedit编辑文件时常用快捷键

问题&#xff1a; 最近在修改文件时提到了gedit这个工具&#xff0c;与vi一样也是一个文件编辑器。但是在命令方面又有不同&#xff0c;在快捷键方面和Windows的使用习惯非常相似。 gedit举例&#xff1a; CTRL-Z:撤销CTRL-C:复制CTRL-V:粘贴CTRL-T:缩进CTRL-Q:退出CTRL-S:保…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...