透過 Go Slog 達成結構化寬事件 logging 最佳實踐
最近有較多的時間思考開發上的最佳實踐,考慮到目前開發的一個後端項目基本就是拿 go 原生的 log 到處打印儲存片面狀態而已。在閱讀一些文件與最佳實踐後,我想著手改善現有的 logging 體驗透過導入 Go 1.21 引入的原生 slog 庫。
最近有較多的時間思考開發上的最佳實踐,考慮到目前開發的一個後端項目基本就是拿 go 原生的 log 到處打印儲存片面狀態而已。在閱讀一些文件與最佳實踐後,我想著手改善現有的 logging 體驗透過導入 Go 1.21 引入的原生 slog 庫。
大多程式都可以採取「並行 Concurrency」的方式來達成簡單安全且高效的運行,但隨著多核 CPU 出現以及特定場景對於效率的追求「平行 Parallelism」運行程式是另一個提高運行效率方向。本文練習透過 Go 複習平行程式開發下資料存取相關技巧:原子操作、鎖、信號量⋯⋯
Redis 是十分常見的 In-Memory 資料庫,工作上時不時會碰到它但很少仔細從頭了解它,所以透過撰寫重現一些案例達成更深刻的理解。快取就是把常存取的資料放在能夠快速獲取的地方,缺點是記憶體不像硬碟適合長久保存資料,但不管是提高速度、降低延遲、降低負擔或減輕成本⋯⋯快取都是很棒的選擇。
相較於 C 讀取未定義數值的變數會造成安全漏洞或崩潰,或是動態語言如 JavaScript 沒有數值型別初始化的問題,Go 的設計上就自動賦予了確定意義的數值避免出錯與創建即可使用。具體來說在例如使用 json 反射的標籤中 `omitempty` 也正是運用了 Zero Value 的概念來判斷。
雖然在 AI 出現之前很難想像,但 2026 年工作上我已經很少「手寫程式」而是透過 AI 更有效率的輔助開發,我相信在 AI 百家爭鳴的時代不用特別執著用哪個模型或工具,挑個最新順手的免費方案就夠了,未來模型只會更便宜更有效率。
前端測試主要重點在與瀏覽器打交道(Jsdom、Headless Browser)且通常只與單一後端進行溝通,而後端測試則是面臨截然不同的難題:分散服務與狀態。這篇文章介紹實戰上我如何透過 Testcontainers 創建 Docker 測試環境來達成完整的後端整合測試流程。
AES(Advanced Encryption Standard)是最廣泛使用的對稱加密,HTTPS/TLS、Wi-Fi(WPA2/3)、全硬碟加密(BitLocker、FileVault)⋯⋯透過理解 AES 如何運作有助於了解現代安全加密如何實踐。
不同網站的密碼需要管理,不僅容易忘記,也存在被竊取或重複使用帶來的風險。如果只需要掃描指紋或使用臉部識別,就能立即完成註冊與登入——這正是 FIDO(Fast IDentity Online)所推動的「無密碼身分驗證」願景。
最近在寫 Go 測試時發現官方與社群中有一種大力推崇的慣例:TableDrivenTest,我一直以為測試應該要保持簡單愚蠢,但這種做法讓我想到程式人的三大美德之一:「懶惰」。可能是因為這種模式通常只是測試框架包裝下的方便手段,而 Go 社群文化下人人對於追求簡單程式有一種莫名的執著。
紀錄近期從 JavaScript 遷移到 Go 的過程中實踐 Set 資料結構的方式。先前代碼使用 JavaScript Set 來實現不重複資料定義,但在 Go 語言當中並沒有實踐 Set 資料結構,但我們可以透過改造 map 來實踐。
紀錄使用到其中一項 Go 1.16 的 embed 功能,可以把任何檔案在編譯時就包進去,進而不用煩惱路徑與環境問題。如果資料需要在 runtime 被修改,那就不適合使用 embed,但如果它是「版本的一部分」,那 embed 是更安全的選擇。
P 與 NP 用來描述解決問題的難度所需的時間為:polynomial time 或 non-deterministic polynomial time。將問題分類為 P 或 NP,有助於理解一個問題是否有可能在合理的時間內被解決——即執行時間不會隨著輸入規模的增長而爆炸性膨脹。
先前探討到:什麼是 Feature Flag 以及它解決什麼問題?了解 Feature Flag 存在的價值後,今天了解更多關於 4 種類型的 Feature Flag 以及實戰上的用途。不同目的的 Flag,在設計方式、生命週期、動態程度與管理策略上都有明顯差異。
我一直覺得事情可以保持簡單就好,有問題改程式碼或環境變數切換就好,何必導入更複雜的套件管理與第三方服務呢?但真實情境當問題發生時不會有空閒慢慢部署與除錯,就有必要透過更完善的 Feature Flag 規劃來降低推送功能的風險,也能減少心臟病發作的機率。
通常有些規模的專案會透過架構分層的方式來管理,而近期在研究如何更好的透過「依賴注入」替換模塊並實現更乾淨的測試。架構分層的概念可以參考之前寫過的:Express.js 入門建構 MVC 範例。我上傳了 go-gin-testing-todos 範例透過 DI 實踐測試架構。