当前位置: 首页 > 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:保…...

项目介绍 MATLAB实现基于贝尔曼方程(Bellman)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码) 专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力

MATLAB实现基于贝尔曼方程&#xff08;Bellman&#xff09;进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面&#xff08;含完整的程序&#xff0c;GUI设计和代码详解&#xff09; 无人机作为现代智能系统…...

如何在uni-app中实现QQ小程序社交功能:完整开发指南

如何在uni-app中实现QQ小程序社交功能&#xff1a;完整开发指南 【免费下载链接】hello-uniapp uni-app框架演示示例 项目地址: https://gitcode.com/gh_mirrors/he/hello-uniapp uni-app作为一款强大的跨平台应用开发框架&#xff0c;能够帮助开发者快速构建包含QQ小程…...

降AI方法选错了会有什么后果?这几个坑别踩

降AI方法选错了会有什么后果&#xff1f;这几个坑别踩 降AI率这件事&#xff0c;大部分同学觉得"无非就是降没降下来"&#xff0c;以为选错方法最多就是浪费点时间。 实际上&#xff0c;有几种后果比这更严重。 后果一&#xff1a;浪费宝贵时间&#xff0c;错过截止…...

ha_xiaomi_home:小米智能家居与Home Assistant无缝集成指南

ha_xiaomi_home&#xff1a;小米智能家居与Home Assistant无缝集成指南 【免费下载链接】ha_xiaomi_home Xiaomi Home Integration for Home Assistant 项目地址: https://gitcode.com/GitHub_Trending/ha/ha_xiaomi_home ha_xiaomi_home是一款开源工具&#xff0c;能帮…...

基于STM32F103的热电偶采集与PID温度控制系统设计方案——包含IAR开发环境下的STM...

STM32F103热电偶采集PID温控采集系统 基于stm32设计&#xff0c;可以实现热电偶采集&#xff0c;PID温度控制&#xff0c;注意51单片机源码基于keil开发环境&#xff0c;STM32源码基于IAR开发环境 提供原理图&#xff0c; PCB(AD格式)&#xff0c;源代码 &#xff0c;不提供&am…...

告别重复编码:用快马AI自动生成数据库增删改查代码,效率提升300%

今天想和大家分享一个提升开发效率的实用技巧——如何用InsCode(快马)平台快速生成数据库相关代码。作为一个经常需要开发库存管理系统的程序员&#xff0c;我发现每次从零开始写数据库模块特别耗时&#xff0c;特别是那些重复的增删改查代码。最近尝试用快马平台后&#xff0c…...

重获数据自主权:WechatDecrypt让你掌控数字记忆

重获数据自主权&#xff1a;WechatDecrypt让你掌控数字记忆 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字时代&#xff0c;我们的聊天记录、社交关系和工作信息都存储在第三方平台上&#xff0c;…...

为什么BaiduPCS-Web成为百度网盘下载的终极解决方案?

为什么BaiduPCS-Web成为百度网盘下载的终极解决方案&#xff1f; 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 你是否曾经面对百度网盘几十KB/s的下载速度感到绝望&#xff1f;当重要的文件需要下载&#xff0c;而进度条却…...

granite-4.0-h-350m部署案例:Ollama在科研团队内部知识引擎中的应用

granite-4.0-h-350m部署案例&#xff1a;Ollama在科研团队内部知识引擎中的应用 如果你在一个科研团队工作&#xff0c;每天面对海量的论文、实验报告和内部文档&#xff0c;是不是经常感觉信息过载&#xff0c;想找点资料就像大海捞针&#xff1f;或者&#xff0c;当新成员加…...

OmenSuperHub:暗影精灵游戏本硬件控制的开源革新方案

OmenSuperHub&#xff1a;暗影精灵游戏本硬件控制的开源革新方案 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 一、问题引入&#xff1a;原厂硬件控制软…...