Git Hooks 超實用指南:用途、工作流程與實戰範例
Git Hooks 允許你在本機或伺服器端於特定 Git 事件發生前後執行腳本,自動化檢查、格式化、測試與部署流程。本文介紹常見 Hook 類型、使用時機與實戰範例 (Shell、Husky、Server-Side)。 一、Git Hooks 分類 節點 本機 (Client-Side) 伺服器端 (Server-Side) Commit pre-commit, prepare-commit-msg, commit-msg, post-commit pre-receive, update, post-receive Push pre-push post-update 其他 pre-rebase, pre-merge-commit, applypatch-msg, post-checkout - Hooks 皆位於 repo/.git/hooks/,初始以 .sample 結尾,去掉副檔名並加執行權限即可啟用。 二、本機 Hook 實戰1. pre-commit:Lint & Test12345678#!/bin/sh#...
npm、npx 與 pnpm:用途、差異與選型指南
npm、npx 與 pnpm 都與 JavaScript 生態的套件安裝與執行有關,但定位與功能不盡相同。本文以表格快速比較,並說明各自最佳使用情境。 一、核心定位 工具 所屬專案 主要功能 安裝方式 npm Node 官方 套件管理 (install / publish) Node 安裝時內建 npx npm 附帶 (v5.2+) 即時執行 Node 套件 npm 一同安裝 pnpm 獨立社群 高效能套件管理 (硬連結) npm i -g pnpm 二、npm:經典套件管理器 指令:npm install <pkg>、npm run <script>、npm publish。 特點: node_modules 巢狀結構 (較佔空間)。 支援 lockfile (package-lock.json) 確保版本一致。 生態最廣泛,官方默認。 三、npx:臨時執行套件 指令:npx create-react-app myapp。 用途: 一次性 CLI 工具,避免全域安裝。 預設先尋...
Golang WaitGroup vs. errgroup:用途、差異與實務範例
在 Go 開發中,同步多個 Goroutine 的完成狀態常見兩大工具:標準庫 sync.WaitGroup 與 golang.org/x/sync/errgroup。本文從 API、錯誤處理、Context、併發控制 等面向比較兩者差異,並給出典型使用時機與程式碼範例。 一、核心概念 名稱 所屬套件 主要職責 WaitGroup sync (標準庫) 計數同步:等待一組 Goroutine 全部執行完畢 errgroup.Group golang.org/x/sync/errgroup WaitGroup + 收集第一個錯誤 + Context 取消 + 併發上限 二、基本用法1. WaitGroup1234567891011var wg sync.WaitGroupurls := []string{"/a", "/b", "/c"}for _, u := range urls { wg.Add(1) go func(u string) { ...
Golang 標準 log 與 Uber zap:用途、差異與選型指南
在 Go 專案中,日誌 (Logging) 是觀察系統行為、除錯與監控的關鍵。標準庫 log 與 Uber 開源的 zap 是最常見的兩大方案。本文針對 功能、效能、結構化能力、社群生態 等面向比較兩者,並提供選用建議與範例程式碼。 一、快速概覽 特性 log (標準庫) zap (Uber) 封裝位置 log 標準庫 go.uber.org/zap API 風格 簡單函式:Println / Fatal 結構化:Info("msg", zap.String("k", v)) 格式 純文字 JSON / Console (可切換) 性能 一般;使用 fmt.Fprintf 高性能;預先序列化、零 alloc path 日誌等級 無官方;需自管 Debug / Info / Warn / Error… 呼叫層級 全域 (package-level) 建議注入 *zap.Logger 物件 旋轉 / Hook 需第三方 (lumberjack) 同樣需組合...
Go語言泛型完全指南:從基礎到實戰應用
前言Go 語言(Golang)在 1.18 版本中正式引入了期待已久的泛型(Generics)功能,這是該語言自誕生以來最重大的語法變革之一。泛型的加入使 Go 語言在保持簡潔性和高效能的同時,顯著提升了程式碼的重用性和型別安全性。本文將深入探討 Go 語言泛型的基本概念、語法特性、實際應用場景,以及使用時的最佳實踐,幫助開發者充分利用這一強大功能。 泛型基本概念什麼是泛型?泛型是一種程式設計技術,允許開發者編寫能夠處理多種資料型別的函式、方法或資料結構,而無需為每種型別重複撰寫相同的邏輯。在泛型出現之前,Go 開發者通常需要: 為不同型別編寫多個幾乎相同的函式 使用空介面(interface{})並進行型別斷言 使用程式碼生成工具 這些方法各有缺點:重複程式碼增加維護成本;使用空介面失去編譯時型別檢查;程式碼生成增加建置複雜性。泛型的引入解決了這些問題。 Go 泛型的設計理念Go 團隊在設計泛型時遵循了以下原則: 保持簡單性:避免過於複雜的型別系統 編譯時型別安全:在編譯時捕獲型別錯誤 與現有 Go 語言特性兼容:泛型應自然融入 Go...
MongoDB 查詢操作符全面指南:從基礎到進階應用
前言在現代應用開發中,MongoDB 作為一款領先的 NoSQL 文件型資料庫,以其靈活的資料模型和強大的查詢能力而廣受歡迎。而 MongoDB 查詢操作符是實現這種強大查詢能力的核心元素,它們使開發者能夠精確地從資料庫中檢索、過濾和操作資料。本文將深入探討 MongoDB 的各類查詢操作符,從基本的比較操作符到進階的陣列、邏輯和元素操作符,並通過實例展示其在實際應用中的使用方法。 基本概念在深入了解各類操作符之前,我們需要先理解 MongoDB 查詢的基本結構。MongoDB 使用 BSON(Binary JSON)格式來儲存文件,查詢則使用類似 JSON 的語法。 基本查詢結構如下: 1db.collection.find({ <field>: <value> }) 當需要更複雜的條件時,我們就需要使用查詢操作符: 1db.collection.find({ <field>: { <operator>: <value> }...
Golang 各種打印方法詳解
Golang 各種打印方法詳解在 Golang 程序開發過程中,打印輸出是我們進行調試和日誌記錄的重要手段。Go 語言提供了豐富的打印函數,主要集中在 fmt 和 log 包中。本文將詳細介紹這些打印方法的使用場景、特點和示例代碼。 目錄 fmt 包的打印函數 Print/Println/Printf Sprint/Sprintln/Sprintf Fprint/Fprintln/Fprintf log 包的打印函數 Print/Println/Printf Fatal/Fatalln/Fatalf Panic/Panicln/Panicf 格式化動詞 自定義打印格式 實用技巧與最佳實踐 fmt 包的打印函數fmt 包是 Go...
Golang中的多值返回:從map到其他型別
Golang中的多值返回:從map到其他型別在Go語言中,有多種操作可能返回兩個或更多的值。最常見的例子是從map中獲取元素時,會同時返回該元素的值和一個表示元素是否存在的布林值。本文將詳細探討Golang中的多值返回機制,從map開始,擴展到其他支援這種模式的型別和操作。 1. Map的雙值返回機制1.1 基本用法在Go中,當從map中獲取一個元素時,會返回兩個值: 1234567891011121314151617181920// 宣告一個mapages := map[string]int{ "Alice": 25, "Bob": 30, "Carol": 35,}// 從map中獲取元素age, exists := ages["Alice"]if exists { fmt.Printf("Alice的年齡是: %d\n", age)} else { ...
Golang條件判斷語法全攻略
Golang條件判斷語法全攻略條件判斷是程式設計中不可或缺的控制結構,用於根據特定條件執行不同的程式碼路徑。Golang(Go語言)提供了簡潔且強大的條件判斷語法,本文將全面探討Go中的各種判斷寫法,從基本的if語句到更複雜的switch結構,以及一些獨特的Go語言實踐。 1. 基本if語句Go的if語句與大多數程式語言相似,但有其特色——不需要括號包圍條件表達式。 1.1 標準if語句123if condition { // 當condition為true時執行的程式碼} 實際例子: 1234age := 18if age >= 18 { fmt.Println("成年人")} 1.2 if-else語句12345if condition { // 當condition為true時執行} else { // 當condition為false時執行} 實際例子: 123456temperature := 35if temperature...
Golang型別宣告與值賦予完全指南
Golang型別宣告與值賦予完全指南Golang(Go語言)因其簡潔的語法和強大的型別系統而聞名。與其他程式語言不同,Go提供了多種宣告變數和型別的方式,同時具有靜態型別檢查的安全性。本文將詳細介紹Go語言中各種型別的宣告方式及如何為這些型別賦值。 1. 基本型別的宣告與賦值1.1 數值型別Go語言提供了豐富的數值型別,包括整數和浮點數。 整數型別12345678910111213// 有符號整數:int, int8, int16, int32, int64var a int = 10var b int8 = 127 // -128 到 127var c int16 = 32767 // -32768 到 32767var d int32 = 2147483647var e int64 = 9223372036854775807// 無符號整數:uint, uint8, uint16, uint32, uint64, uintptrvar f uint = 10var g uint8 = 255 // 0 到 255var h uint16 = 65535var i...