"Go"
- Collector 架構
HTTP endpoint → JSON Schema 驗證 → 儲存 → 查詢 → rule engine 的五段式處理鏈路
- 9.1 用 stdlib flag 寫 subcommand CLI
Go 的 flag 套件足以支撐多層 subcommand 的 CLI,不用過早引入 cobra;本章示範 main → cmd/ → internal/ 的標準 layout
- 0.1 Go 的簡單哲學與認知負擔
理解 Go 為什麼偏好顯式、直線流程與少量語法
- 1.1 channel ownership 與關閉責任
判斷誰能送出、接收與關閉 channel
- 1.1 Go 專案結構與 module
理解 go.mod、module path 與 Go 專案的依賴邊界
- 2.1 read pump / write pump 模式
分離 WebSocket 讀取、寫入與心跳
- 2.1 struct 與 JSON tag
理解 Go struct 如何表達資料形狀,並透過 JSON tag 對應外部格式
- 3.1 fmt、strings 與基本文字處理
處理格式化輸出、字串清理、切割與組合
- 3.1 GC 與 memory limit
理解 debug.SetMemoryLimit 在長時間服務中的用途
- 4.1 goroutine:輕量並發工作
用 goroutine 啟動並發工作,並設計清楚的退出條件
- 4.1 事件來源、處理流程與狀態邊界
分辨事件來源、事件融合、處理流程、狀態真相與推送邊界
- 5.1 時間注入與狀態轉移測試
讓時間相關邏輯可重現
- 5.1 錯誤回傳與早期返回
寫出可追蹤的失敗路徑
- 6.1 graceful shutdown 與 signal handling
用 signal 與 context 傳遞停止訊號
- 6.1 如何新增一個即時訊息 action
修改 client message、路由與 handler
- 7.1 把 handler 邏輯拆成可測單元
分離 HTTP 協定處理與核心邏輯
- 7.1 資料庫 transaction 與 schema migration
把 repository 邊界延伸到資料庫交易、migration 與一致性語意
- 9.2 第三方 parser 整合:goldmark AST 入門
用 goldmark 把 markdown 解析成 AST,掌握 ast.Walk visitor 模式、block 與 inline 節點的判讀、byte offset 如何定位到行號
- 0.2 組合優先:小介面與明確依賴
用小介面與 struct 組合取代大型繼承結構
- 1.2 select loop 的生命週期設計
理解長時間運行 goroutine 如何同時處理事件、ticker 與取消
- 1.2 變數、零值與短變數宣告
理解 Go 如何宣告、初始化與使用零值
- 2.2 heartbeat、deadline 與連線清理
用 ping/pong 和 deadline 偵測失效連線
- 2.2 slice 與 map
掌握 Go 最常用的集合型別:slice 與 map
- 3.2 pprof 基礎診斷流程
用 pprof endpoint 診斷 heap、goroutine 與 CPU 問題
- 3.2 time:時間與 duration
表達時間點、時間差、timer、ticker 與 timeout
- 4.2 channel:資料傳遞與 backpressure 理解 channel 如何在 goroutine 之間傳遞資料並形成 backpressure
- 4.2 事件去重與語義鍵設計
用 entity ID、event type、來源語意與時間窗口建立去重鍵
- 5.2 testing 基礎
用 testing package 驗證函式行為
- 5.2 WebSocket integration test
驗證 client/server 實際互動
- 6.2 如何新增一種 domain event
擴展事件常數、輸入驗證與處理流程
- 6.2 健康檢查與診斷 endpoint
區分服務可用性與工程診斷入口
- 7.2 Durable queue、outbox 與 idempotency
設計跨 process 事件傳遞的可靠性與去重邊界
- 7.2 用 interface 隔離外部依賴
建立小而穩定的測試替身
- 9.3 AST 驅動的 idempotent 文字改寫
用 AST 定位位置、用 line-based 或 byte-level 改寫;設計多條 rule 的執行順序;--check 跟 --fix 如何共用邏輯
- 0.3 錯誤處理:把失敗路徑寫出來
理解 Go 顯式錯誤處理在服務維護中的價值
- 1.3 非阻塞送出與事件丟棄策略
設計 channel 滿載時的服務行為
- 1.3 控制流程:if、for、switch
掌握 Go 的條件判斷、迴圈與分支控制
- 2.3 interface:用行為定義依賴
用小介面描述元件需要的能力
- 2.3 訂閱模型與訊息路由
將 client action 對應到主題訂閱狀態
- 3.3 goroutine leak 偵測
判斷背景工作與 client pump 是否正確退出
- 3.3 os/io:檔案與輸入輸出
讀寫檔案,理解 io.Reader 與 io.Writer
- 4.3 select:同時等待多種事件
用 select 建立事件迴圈
- 4.3 Source of Truth:狀態邊界
集中狀態更新、保護可變資料、設計查詢 projection
- 5.3 race condition 檢查
用 go test -race 找資料競爭
- 5.3 table-driven test
用表格整理多組輸入、預期輸出與錯誤情境
- 6.3 如何擴展狀態投影欄位
更新狀態模型、repository 與 API 輸出
- 6.3 結構化日誌欄位設計
讓 log 可 grep、可聚合、可追蹤
- 7.3 事件去重邏輯的重構策略
保留語義鍵並降低重複流程
- 7.3 跨節點 WebSocket、presence 與重連協定
把單一 server 的 WebSocket hub 擴展到多節點推送與連線狀態
- Go 平台適配
Graceful shutdown、signal handling、HTTP server 自身監控 — Go SDK 和 collector 端共同面對的平台問題
- 9.4 跨檔案圖分析:從 lint 走到 static analysis
Single-file 規則用 AST 搞定;跨檔 orphan 偵測、broken link、backlink 完整性需要把整個 repo 建成圖再走訪。用 mdtools cards 為例
- 0.4 什麼時候選 Go
用選型條件判斷 Go 是否適合高併發服務、背景工作與長連線場景
- 1.4 package、檔案與可見性
看懂 package main、檔案切分與大小寫可見性
- 1.4 共享狀態與複製邊界
用 lock 與 copy 保護長期服務的狀態資料
- 2.4 常數與 typed string
管理狀態值、事件類型與協定字串
- 2.4 慢客戶端與 send buffer 管理
控制推送佇列與記憶體風險
- 3.4 encoding/json:資料交換
用 encoding/json 在 struct、檔案與 HTTP 之間交換資料
- 3.4 資料結構與 allocation 壓力
分析列表、歷史資料與 WebSocket payload 的配置成本
- 4.4 sync.RWMutex:保護共享狀態
用讀寫鎖保護共享狀態
- 4.4 多來源 event 融合
合併 HTTP、queue、timer 與外部事件來源
- 5.4 HTTP handler 測試
用 httptest 驗證 request 與 response
- 5.4 table-driven test 的設計邊界
避免測試資料混雜太多概念
- 6.4 如何新增背景工作流程
接入 context、channel 與 shutdown
- 6.4 版本偵測與 feature gate
依版本與環境能力啟用功能
- 7.4 Observability pipeline、metrics 與 tracing
把 structured log、metric、trace 與 profile 組成可操作的診斷系統
- 7.4 狀態管理的安全邊界
用 lock、copy 與 API 限制保護共享狀態
- go vs push vs pushReplacement 的 UX 語意表
三種導航方法對堆疊、back 行為、使用者心理模型的影響 — 選擇依據是使用者的意圖而非技術方便
- 9.5 工具決策:regex 到 AST、Python 到 Go 的 tripwire
什麼訊號代表工具該升級到下一個層次;用 WRAP 框架做語言與實作層的技術決策;延遲決策的成本
- 0.5 Go 和其他並發語言的差異
比較 Go、Java、C#、Rust、Node.js、Python async、Erlang/Elixir 在並發服務中的工程定位
- 4.5 高併發控制與 backpressure 用 bounded concurrency、backpressure 與 cancellation 控制 goroutine 的成長
- 1.5 bounded worker pool
限制同時執行的 goroutine 數量,讓背景工作有明確容量邊界
- 1.5 從單檔到多檔案
理解 Go 程式如何從 main.go 長成多檔案與多 package
- 2.5 指標與資料複製邊界
理解指標、slice 與共享狀態的防護策略
- 3.5 net/http 與 handler 設計
用 net/http 建立健康檢查、API endpoint 與清楚的 handler 邊界
- 5.5 時間注入與 deterministic test
用 time provider 避免測試依賴真實時間
- 6.5 如何新增結構化記錄欄位
區分 operational log、domain event log 與狀態資料
- 7.5 Kubernetes、systemd 與 load balancer 合約
理解部署平台如何影響 Go 服務的 shutdown、health 與資源限制
- 7.5 以 domain 重新整理 package
讓 account、job、event、workflow 這類領域邊界在目錄中可見
- 9.6 Pre-commit hook 與 CI 整合
工具寫完只是起點;接到 pre-commit hook 跟 CI 才真正守住品質。Re-staging、dry-run vs apply、不能繞過的邊界
- 1.6 rate limiting 與 backpressure 用本地速率限制與 backpressure 策略保護服務入口與下游依賴
- 1.6 函式、方法與 receiver
區分普通函式、建構函式與帶 receiver 的方法
- 2.6 struct embedding 與組合式設計
理解 Go 的 embedding、方法提升與組合邊界
- 3.6 log/slog:結構化日誌
用 key-value log 設計可查詢、可過濾的程式訊號
- 5.6 並發行為測試
測試 channel、goroutine 與狀態更新
- 6.6 如何新增 repository port
先建立儲存邊界,再決定 memory、SQLite 或外部資料庫實作
- 7.6 CI、fuzz、load test 與 chaos testing
把單元測試與整合測試擴展成服務可靠性驗證流程
- 7.6 逐步遷移到 ports/adapters 架構
用 ports 與 adapters 控制 Go 服務的依賴方向
- 5.7 錯誤處理與測試在高併發服務中的角色
把錯誤路徑、測試保護與並發行為放進服務可靠性觀點
- 6.7 Go 常見服務場景總覽
整理 Go 最常落地的服務情境:即時、背景、事件、通知與 API 聚合
- 1.7 從入口程式看應用啟動流程
用入口程式建立 Go 程式的啟動與資料流模型
- 2.7 generics 入門:型別參數與約束
用最小範圍理解 Go generics 的適用場景
- 3.7 context:取消、逾時與生命週期
用 context 傳遞取消、逾時與請求生命週期
- 7.7 composition root 與依賴組裝
把具體 adapter、config 與 usecase wiring 留在應用入口層
- 6.8 高併發下的 Redis 與 SQL 使用原則
從 Go 服務角度整理 Redis 與 SQL 的高併發存取邊界
- 7.8 壓力出現後的重構路線
當 Go 服務變大時,如何按壓力逐步重構邊界
- 1.8 Go tooling 與日常開發流程
用 go run、go test、go fmt、go mod tidy 建立 Go 專案的基本工作節奏
- 3.8 defer 與資源清理
用 defer 管理 close、unlock、cleanup 與 panic 邊界
- 3.9 flag、os/env 與設定邊界
用標準庫讀取設定,並把外部輸入轉成 config struct
- 3.10 標準庫如何支撐服務型 Go
把 context、net/http、log/slog、defer 與 time 連成服務底座
- Go 教材核心術語
整理 Go 入門與進階篇共用的架構、事件、狀態與邊界詞彙
- 10 個 Ticket、57 個綠燈、0 條追溯:從需求文件到測試的銜接檢討
單元測試全綠、卻答不出「這些測試覆蓋了哪些 UseCase 場景」。需求到測試缺反向追溯時的流程缺口盤點與對應修法(追溯矩陣、存根策略、拆分規則)。
- 9.0 Go 在工具鏈生態的位置
後端服務以外,Go 常被用來寫 CLI、靜態分析、基礎設施客戶端。本章建立工具類 Go 程式跟服務類 Go 程式在結構、生命週期與錯誤處理上的分野
- mdtools:Go + goldmark 的 markdown 工具鏈設計
mdtools 的架構決策:選 Go + goldmark 的理由(與 Hugo 同源保證 lint↔render 等價)、單 binary 多子命令設計、pre-commit 整合、規則開啟紀律。
- 4.0 Go 並發模型總覽
先理解 goroutine、OS thread 與 runtime 排程,再看高併發應用怎麼設計