標籤: Go

共 7 篇

Go 大工程的程式碼目錄分析:以 k8s、multica、etcd、prometheus 為例

2026年10月31日

從 Java 轉過來的人開啟 kubernetes 原始碼,第一反應是找 controller、service、dao——看到的卻是 cmd、pkg、staging。順著這個困惑往下追:這三個目錄各是什麼來歷,為什麼 etcd 連 cmd 和 internal 都沒有,k8s 的 controller 為什麼不是那個 controller,multica 又怎麼長回了 handler/service/db 三層,prometheus 為什麼連 service 層的生態位都沒有。

Dagger 1.0 和 GitHub Actions:第三代 CI 換掉了什麼

2026年10月25日

Dagger 1.0 beta 的釋出博文說自己是繼 Jenkins、GitHub Actions 之後的第三代 CI,還說一條 dagger cloud checks on 就能替掉 GitHub Actions。兩者是同一類東西嗎?順著問題往下追:兩邊的配置各自描述了什麼;誰在執行、快取放在哪;改一行程式碼各自重算了什麼;整合測試要的資料庫誰來起;測試掛了以後看到的是什麼;本地能不能跑同一套;最後是 Cloud Checks 和按用量計費到底替掉了哪一層。全部場景用同一個 Go 小專案,在 GitHub 的 ubuntu-latest 機器上實測。

Go 的測試為什麼和程式碼放在一起:大型工程怎麼組織測試

2026年10月25日

開啟 Go 標準庫的 net/http,77 個檔案裡一半是 `_test.go`,和程式碼交錯排著。這樣真的不亂嗎?為什麼不能像 Java 那樣挪進單獨的 `tests/` 目錄,整合測試和 e2e 又該放哪?

QuickJS 嵌在哪門語言裡跑得最好

2026年10月25日

同一份 fib(25),C 裡 7 毫秒,Go 的 wazero 繫結 23 毫秒,Java 裡 61 毫秒;從 Go 調一次 JS,快的 89 納秒,慢的 34 微秒。同一個引擎,差距為什麼能有一個數量級?問題出在引擎版本、執行方式,還是繫結本身?

用 Go 寫 Mac 桌面程式:原生視窗和選單欄圖示

2026年10月24日

Go 寫的小工具,最省事的介面是起一個 http server 再開啟瀏覽器。如果想要的是 Mac 上那種雙擊就開、右上角選單欄常駐一個圖示、點一下彈出面板的程式,該怎麼做?順著問題往下追:視窗歸 AppKit 管,Go 怎麼調到它;為什麼介面程式碼必須鎖在主執行緒上;選單欄圖示、彈出面板和不進 Dock 是怎麼做到的;Fyne、Gio、Wails、systray 等十幾個現成的庫,視窗裡的內容各是誰畫的,哪些裡面其實是網頁;兩個庫各管視窗和圖示時為什麼打架;最後怎麼打成 .app、簽名和公證,發給別人也能開啟。全部方案在同一臺 macOS 15 上實測。

CEL 表示式語言:為什麼出現,和同類語言比怎麼樣,該怎麼用

2026年10月22日

Kubernetes 的 CRD 裡有一行 self.minReplicas <= self.replicas,Google Cloud 的 IAM 條件、Envoy 的 RBAC 裡也是同一種寫法。它叫 CEL。我們從一個普通需求出發:讓使用者在平臺裡自己寫放行規則。嵌入指令碼語言會碰到能呼叫什麼、會不會停、寫錯了何時知道、每次多慢四個問題;CEL 用非圖靈完備、型別檢查和成本估算回答它們。再把 CEL 和 expr、Rego、Cedar、JsonLogic、Starlark、Lua、SpEL 等 22 個同類實現放進同一組場景實測,最後整理出在 Go 裡用好 CEL 的做法。

Go 專案的資料庫遷移:手寫 .sql 檔案,一次變更怎麼走到生產

2026年10月21日

Go 服務新版本上線,日誌裡刷出 column "coupon_code" does not exist:加列的 SQL 寫了,生產庫沒人執行。順著這個現象往下追:手寫的 .sql 檔案怎麼交給 golang-migrate 和 goose 去執行,執行到一半失敗了庫裡留下什麼,兩個分支各加一個檔案時會不會漏掉一個,一個 .sql 從提交、CI、打包到部署要走哪幾步、由誰來執行,一條只改後設資料的 ALTER 為什麼能把整張表堵住,新舊程式碼同時線上時列名怎麼跨幾個版本改,只宣告終態讓 Atlas、sqldef、pg-schema-diff、Skeema 自動算變更行不行,最後是 down 檔案到底能不能用來回滾。