博客 / 詳情

返回

用 Go 像寫 Web 一樣做桌面應用:完全離線的手機號歸屬地查詢工具

前陣子我做了一個小工具:一個完全離線的手機號歸屬地查詢桌面應用

功能本身其實並不複雜,但在這個過程中,我反而重新認識了一次

用 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 本身非常適合這種場景,但如果在應用啓動時再一條條初始化寫入數據庫,體驗會非常糟糕。

所以我的做法是:

  1. 提前生成一個完整的 .db文件
  2. 在構建時,通過 embed.FS 把這個數據庫文件帶進程序
  3. 程序啓動時:

    • 如果用户本地還沒有數據庫
    • 就直接把這份已經初始化好的 .db 拷貝過去

這樣一來:

  • 啓動速度很快
  • 不需要額外初始化邏輯
  • 數據也完全可控、可更新

這一步做完,後面的事情就簡單很多了。

當然,考慮到數據會更新,我預留了構建腳本,方便開發過程中構建這個 ​.db​ 文件

開發體驗:真的很像在寫 Web

剩下的開發過程,基本就是“Web 開發的本地版”:

  • Go 這邊寫好查詢服務
  • app.go 封裝成方法
  • 前端直接調用,不需要網絡請求
  • wails build 一次性完成:

    • 前端打包
    • 後端編譯
    • 桌面應用生成

項目放在 GitHub 上之後,再配合 GitHub Actions,就可以自動構建 Windows / macOS 的可執行文件,整個流程非常順。


一個很小的項目,但這個思路很實用

這個項目本身並不複雜,代碼量也不多,我也儘量寫了比較完整的註釋。

如果你:

  • 想試試 用 Go 寫桌面應用
  • 又或者只是需要一個 離線的手機號歸屬地查詢工具

都可以看看這個項目,或者直接下載編譯好的程序來用。

項目地址在這裏:

👉 https://github.com/zxc7563598/go-mobile-locator

有時候換一種“應用形態”,

反而能讓很多原本彆扭的問題,一下子順起來。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.