所有文章列表

CPU 符號

32-bits 與 64-bits 系統差異

還記得小時候的電腦都是 32-bits 的系統,大約在 win7 的時代已經逐步的替換成 64-bits 系統了,但我還是不了解具體來說有什麼差異,只記得有段時間有兩種軟體規格可以選擇,或是某些軟體需要用「兼容模式」來執行。

記憶體圖示

Go struct 記憶體對齊如何提升記憶體運用效率

在學習 Go 時會了解到 `struct` 其實就是一串自訂的資料結構,而其中欄位的「順序」將直接影響到在記憶體中所佔用的實際大小甚至程式的速度。了解記憶體對齊的概念除了「節省空間」外也能為打造「更佳的緩存局部性(Cache locality)」。

魔法棒符號

於 CI 自動化靜態驗證 Go 提升代碼品質

近期在開發 Go 專案時發現到提交代碼流程總是有些摩擦,像是開發時習慣用 Tab 到 GitLab 上寬度就會變得很奇怪,或是一些簡單的對齊問題都在無形消耗專注力。所以透過把一些原生的 Go 靜態檢查工具搬到 CI 上執行,確保統一的開發體驗。

清單符號

透過 Go Slog 達成結構化寬事件 logging 最佳實踐

最近有較多的時間思考開發上的最佳實踐,考慮到目前開發的一個後端項目基本就是拿 go 原生的 log 到處打印儲存片面狀態而已。在閱讀一些文件與最佳實踐後,我想著手改善現有的 logging 體驗透過導入 Go 1.21 引入的原生 slog 庫。

同步符號

平行程式開發:原子操作、鎖、信號量、具狀態 Goroutine

大多程式都可以採取「並行 Concurrency」的方式來達成簡單安全且高效的運行,但隨著多核 CPU 出現以及特定場景對於效率的追求「平行 Parallelism」運行程式是另一個提高運行效率方向。本文練習透過 Go 複習平行程式開發下資料存取相關技巧:原子操作、鎖、信號量⋯⋯

網格符號

從頭了解 Redis 快取種類與常見災難

Redis 是十分常見的 In-Memory 資料庫,工作上時不時會碰到它但很少仔細從頭了解它,所以透過撰寫重現一些案例達成更深刻的理解。快取就是把常存取的資料放在能夠快速獲取的地方,缺點是記憶體不像硬碟適合長久保存資料,但不管是提高速度、降低延遲、降低負擔或減輕成本⋯⋯快取都是很棒的選擇。

標籤圖示

Go 的 Zero Value 與實戰案例

相較於 C 讀取未定義數值的變數會造成安全漏洞或崩潰,或是動態語言如 JavaScript 沒有數值型別初始化的問題,Go 的設計上就自動賦予了確定意義的數值避免出錯與創建即可使用。具體來說在例如使用 json 反射的標籤中 `omitempty` 也正是運用了 Zero Value 的概念來判斷。

Robot Icon

學會挑選合適的模型透過 Ollama 本地運行 LLM

雖然在 AI 出現之前很難想像,但 2026 年工作上我已經很少「手寫程式」而是透過 AI 更有效率的輔助開發,我相信在 AI 百家爭鳴的時代不用特別執著用哪個模型或工具,挑個最新順手的免費方案就夠了,未來模型只會更便宜更有效率。

打勾圖示

使用 Testcontainers 實現後端整合測試

前端測試主要重點在與瀏覽器打交道(Jsdom、Headless Browser)且通常只與單一後端進行溝通,而後端測試則是面臨截然不同的難題:分散服務與狀態。這篇文章介紹實戰上我如何透過 Testcontainers 創建 Docker 測試環境來達成完整的後端整合測試流程。

Passkey 圖示

實戰 FIDO 驗證實現無密碼登入

不同網站的密碼需要管理,不僅容易忘記,也存在被竊取或重複使用帶來的風險。如果只需要掃描指紋或使用臉部識別,就能立即完成註冊與登入——這正是 FIDO(Fast IDentity Online)所推動的「無密碼身分驗證」願景。

表格符號

Go 測試道地寫法:Table Driven Test

最近在寫 Go 測試時發現官方與社群中有一種大力推崇的慣例:TableDrivenTest,我一直以為測試應該要保持簡單愚蠢,但這種做法讓我想到程式人的三大美德之一:「懶惰」。可能是因為這種模式通常只是測試框架包裝下的方便手段,而 Go 社群文化下人人對於追求簡單程式有一種莫名的執著。

板手圖示

Go Set 資料結構道地寫法

紀錄近期從 JavaScript 遷移到 Go 的過程中實踐 Set 資料結構的方式。先前代碼使用 JavaScript Set 來實現不重複資料定義,但在 Go 語言當中並沒有實踐 Set 資料結構,但我們可以透過改造 map 來實踐。