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

作为 PHP 开发者,我第一次用 Go 写了个桌面应用

我平时是做 PHP 的,工作里基本上都是在写 Web 应用。说实话,写久了难免有点惯性思维:服务器、框架、数据库、API、浏览器。
而这次,我做了点不一样的东西 —— 一个用 Go 写的财务管理桌面应用

很多人可能会觉得奇怪:财务管理、记账软件,这不已经烂大街了吗?随便一搜一大堆,为什么还要自己做一个?

我其实一开始也没打算做什么大而全的产品,而是因为一个很小的念头:我想试试 Go 写应用,并打包成 Windows 或 Mac 上能跑的桌面软件


为什么会有这个念头

PHP 的世界里,几乎绕不开服务器。写一个应用,哪怕功能再小,也得起一个 Web 服务,访问地址可能是 http://localhost:8080,然后浏览器打开用。
这没什么不好,但问题是:

  • 它总归还是个 Web 应用,本地其实只是跑个“假服务器”;
  • 想给别人用,要么部署服务器,要么教别人配环境,挺麻烦;
  • 没法一键生成一个“能直接安装”的应用。

而 Go 给了我一种完全不同的体验:随手 go build,就能编译出一个二进制文件,甚至还能轻松跨平台打包。
这让我很感兴趣,于是就有了这个想法:不如用 Go 写个小工具,然后打包成桌面应用跑跑看。


为什么是财务管理?

那为什么选财务管理呢?因为这个需求对我来说刚好存在

我平时的开销基本都在支付宝和微信里,虽然它们各自有统计,但没法合并在一起。
我更希望把两个平台的账单统一起来,还能对消费分类做个合并统计,好让我清楚钱都花到哪里去了。

而财务管理这个主题也很适合练手:

  • 前端:做一个管理后台页面,用来录入、展示、统计;
  • 后端:提供账单存储和查询的 API;
  • 再加上:尝试把它打包成桌面应用

于是我就开工了。


开发过程中的一些体会

做到现在,项目已经算是一个最基础可用的版本了。虽然功能不复杂,但过程里的体会挺有意思。

1. Go 确实很“轻”

写 PHP 的时候,要部署、要跑服务,框架本身也会预先定义很多结构。
而 Go 就很朴素:从监听端口开始,一切都要自己实现。听起来像是会很麻烦,但实际体验完全不是这样。

端口监听、配置文件、路由、中间件……几行代码就能完成。
不仅没有在基建上“浪费时间”的感觉,反而有一种更自由的掌控感。这对我来说很新鲜。

2. 桌面应用和 Web 应用的边界感

虽然这是“桌面应用”,但本质上我还是走前后端分离。
前端在 fintrack-frontend,后端在 fintrack-backend,桌面应用只是“换了个壳子”。
可心理上的感觉不一样:它不再是浏览器地址栏里的东西,而是一个真正“装在电脑上的软件”。

3. 跨语言的思维切换

PHP 写久了,写 Go 的时候会下意识去找框架、找 ORM,结果发现 Go 的生态完全不一样。
刚开始有点别扭,但后来发现语言层面的简洁反而让我能更专注在业务逻辑上,不会被一堆“默认约定”牵着走。

4. 做点“无用”的项目很有意思

说实话,这个财务管理应用对别人来说可能没什么价值,毕竟现成的工具太多了。
但对我来说,它让我尝到了用 Go 做“非 Web 应用”的可能性,也多了一个贴合我需求的小工具。


展望

目前项目已经开源,可以直接下载到安装包:

  • 项目仓库:fintrack-backend

支持打包 Windows 和 Mac 版本,算是实现了我最初的目标。

接下来,我可能会继续加一些功能:

  • 更好看的图表分析;
  • 多账本支持;
  • 导入/导出 CSV;
  • 甚至试试做移动端。

不过,就算后续不再加功能,这个项目也已经达到了我的目的:
它让我走出了 PHP + Web 的惯性思维,尝试了另一种可能。


很多时候,我们写的小项目,在别人看来可能就是“又一个记账软件”,没什么价值。
但对自己来说,它代表的是一个学习过程,一个探索新方向的契机

所以,如果你也有类似的想法,不妨直接去做。
也许别人不一定用,但你自己的收获,已经足够大了。

http://www.hskmm.com/?act=detail&tid=18346

相关文章:

  • JBoltAI智能出题助手:助力高效学习与知识巩固 - 那年-冬季
  • JBoltAI设备智能检测:为设备管理维护提供高效辅助 - 那年-冬季
  • JBoltAI:Java与AI的完美融合,赋能技术团队新未来 - 那年-冬季
  • AIGS与AIGC:人工智能时代的范式跃迁与价值重构 - 那年-冬季
  • 5
  • ?模拟赛(3) 赛后总结
  • 用鼠标滚轮缩放原理图界面的小工具
  • 实验任务1
  • OI界的梗(继 @CCCsuper 2.0 版本)
  • 9/26
  • Python 私有属性深度解析
  • 菜鸟记录:c语言实现洛谷P1219 ———八皇后
  • 当危机爆发时,所有网络安全都是本地的
  • crc校验原理是什么?
  • CF1385D a-Good String
  • 9月23日(日记里有)
  • 9月25日(日记里有)
  • Git 提交代码前,一定要做的两件事
  • 本地调试接口时遇到的跨域问题,十分钟解决
  • 用 Excel 快速处理接口返回的 JSON 数据
  • 调度的基本概念
  • Overleaf项目文件同步工具: olsync
  • CF1995D Cases
  • 日志| 编辑距离 | 最长有效括号 |
  • day5
  • 《etcd库——键值存储系统》 - 教程
  • 有一个函数只会返回0和1,且返回0和返回1的概率不等。要求只能通过这个函数生成一个等概率返回0和1的函数
  • AI智能体开发实战:17种核心架构模式详解与Python代码实现
  • 代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、删除字符串中的所有相邻重复项
  • 2025.9.26总结 - A