前陣子我做了一個小工具:一個完全離線的手機號歸屬地查詢桌面應用
功能本身其實並不複雜,但在這個過程中,我反而重新認識了一次
用 Go 做桌面應用,其實可以非常像在寫一個 Web 項目。
這篇文章不打算講手機號歸屬地怎麼查(那真的很簡單,如果你需要直接到文章底部倉庫下載我做好的工具就好),而是想分享一下:
為什麼我會選擇用 Go + Wails 做成桌面應用,以及這個過程裏的一些實際感受。
一個並不複雜的問題
如果不考慮攜號轉網,手機號歸屬地這件事本身並不複雜。
每個手機號在規劃階段,前七位就已經確定了對應的:
- 運營商
- 省份 / 城市
所以理論上,只要你手裏有一份號段庫,查詢邏輯無非就是:
取前七位 → 查表 → 返回結果
這類數據也並不是什麼秘密。
去 GitHub 看一眼,不同語言都有現成的庫;百度搜一下,也有不少在線查詢網站。
問題不在於“能不能做”,而在於“怎麼用得順不順”。
為什麼現有方案總感覺不太對
在真實使用場景裏,我遇到的需求通常是這樣的:
- 機器 不能聯網
- 需要一次性處理 幾十萬甚至上百萬個手機號
- 只是想快速區分歸屬地,不想額外搭服務
這時候就會發現:
- Web 方案
在線查詢適合查一兩個號碼,但一旦涉及大批量導入(幾十上百萬的數據)或者涉及隱私問題不方便泄漏這些手機號,就會變得很尷尬。 - 腳本 / 代碼庫
不同語言需要不同環境,作為有開發環境的自己用還好,給普通堆代碼一竅不通的人用成本就很高了。
我想要的其實是一個很簡單的東西:
一個不聯網、不裝環境,雙擊就能用的工具。
於是一個想法就冒出來了:
那為什麼不直接做成一個 Windows / macOS 的桌面應用?
為什麼是 Go + Wails
我之前用 Wails 簡單做過一個 PC 端的財務管理應用,但那次更多是“試水”:
- Go 當 Web 服務端
- Vue 打包進桌面
- 本質還是一套前後端分離的 Web 思路
這次我反而想換個方式,儘量按照 Wails 的設計方式完整走一遍。
選擇它的原因也很直接:
-
Go
- 編譯後就是一個可執行文件
- 非常適合做本地工具
- 處理本地數據、文件都很舒服
-
Wails
- 用 Web 技術寫桌面應用
- 不需要起 HTTP 服務
- 前端可以直接調用 Go 方法
我平時用 Vue 比較多,所以直接用:
wails init -n 項目名 -t vue
Wails 支持的模板其實不少,React、Vue、Svelte 都有,翻一翻文檔基本都能找到,這裏就不展開了。
和傳統 Web 最大的不同:沒有路由
如果你是做 Web 開發的,上手 Wails 會非常快。
傳統 Web 項目裏,我們習慣的是:
Router(路由) → Handler(HTTP處理器) → Service(業務邏輯層) → Repository(模型訪問層) → Model(數據模型)
請求通過路由分發到 Handler,再一層層往下走。
而在 Wails 裏:
- 不需要路由
-
app.go裏的方法,會自動暴露給前端 - 前端直接把它當成一個函數來調用
換個角度看:
app.go 裏的方法,其實就相當於傳統 Web 裏的 Router + Handler
至於 Service、Repository、Model 這些分層,完全可以照搬。
只是“請求”不再是 HTTP,而是一次本地方法調用。
這個點讓我感覺非常舒服:
開發思路幾乎沒變,只是把“接口”換成了函數。
48 萬條數據,SQLite 該怎麼放
這個項目裏有一個比較現實的問題:
我內置了 48 萬多條手機號號段數據。
SQLite 本身非常適合這種場景,但如果在應用啓動時再一條條初始化寫入數據庫,體驗會非常糟糕。
所以我的做法是:
- 提前生成一個完整的
.db 文件 - 在構建時,通過
embed.FS把這個數據庫文件帶進程序 -
程序啓動時:
- 如果用户本地還沒有數據庫
- 就直接把這份已經初始化好的
.db拷貝過去
這樣一來:
- 啓動速度很快
- 不需要額外初始化邏輯
- 數據也完全可控、可更新
這一步做完,後面的事情就簡單很多了。
當然,考慮到數據會更新,我預留了構建腳本,方便開發過程中構建這個 .db 文件
開發體驗:真的很像在寫 Web
剩下的開發過程,基本就是“Web 開發的本地版”:
- Go 這邊寫好查詢服務
- 在
app.go封裝成方法 - 前端直接調用,不需要網絡請求
-
wails build一次性完成:- 前端打包
- 後端編譯
- 桌面應用生成
項目放在 GitHub 上之後,再配合 GitHub Actions,就可以自動構建 Windows / macOS 的可執行文件,整個流程非常順。
一個很小的項目,但這個思路很實用
這個項目本身並不複雜,代碼量也不多,我也儘量寫了比較完整的註釋。
如果你:
- 想試試 用 Go 寫桌面應用
- 又或者只是需要一個 離線的手機號歸屬地查詢工具
都可以看看這個項目,或者直接下載編譯好的程序來用。
項目地址在這裏:
👉 https://github.com/zxc7563598/go-mobile-locator
有時候換一種“應用形態”,
反而能讓很多原本彆扭的問題,一下子順起來。