golang 每日一庫之 go-flags
go-flags 是一個用於處理命令行參數和標誌的 Go 庫,它提供了一種簡潔而靈活的方式來定義和解析命令行標誌(flags)和參數。這個庫對於需要處理命令行輸入的 Go 應用程序非常有用,特別是在構建 CLI(命令行工具)時。1. 安裝 go-flags首先,你需要安裝 go-flags 庫。在命令行中運行以下命令:go get github.com/jessevdk/go-flags這個命令會 ⌘ Read more
在 Go 中如何使用分佈式鎖解決併發問題?
在分佈式系統中,協調多個服務實例之間的共享資源訪問是一個經典的挑戰。傳統的單機鎖(如 sync.Mutex)無法實現跨進程工作,此時就需要用到分佈式鎖了。本文將介紹 Go 語言生態中基於 Redis 實現的分佈式鎖庫 redsync,並探討其使用方法和實現原理。分佈式鎖首先我們來探討下爲什麼需要分佈式鎖?當我們編寫的程序出現資源競爭的時候,就需要使用互斥鎖來保證併發安全。而我們的服務很有可能不會單 ⌘ Read more
Go 1-24 中改進的 Finalizer:介紹 runtime-AddCleanup
Go 1.24 通過 runtime.AddCleanup 引入了一個新的、改進的 Finalizer 機制。這個函數是對 runtime.SetFinalizer 的重大改進,提供了更多的靈活性、更好的效率和改進的安全性。Finalizer 在 Go 中扮演着關鍵角色,當對象不再可達時運行清理函數。這允許開發者自動執行諸如關閉文件、釋放內存和註銷資源等重要任務。今天我們將探討 runtime.A ⌘ Read more
Xid:Go 輕量級 ID 生成器
在分佈式系統中,唯一 ID(GUID)是必不可少的,常見的方案包括 UUID、MongoDB ObjectID 和 Twitter Snowflake。其中 UUID 雖然通用,但長度較長,而 Snowflake 需要額外的機器 / 數據中心配置。xid (github.com/rs/xid) 是一個基於 MongoDB ObjectID 算法的更輕量級、更高效的全局唯一 ID 生成庫,用於生成 ⌘ Read more
golang 每日一庫之 concurrent-map
概述orcaman/concurrent-map/v2 是一個 Go 語言的高性能併發安全哈希表實現。它通過分片鎖(shard locking)策略減少鎖競爭,適用於高併發讀寫場景。與標準庫的 sync.Map 不同,該庫針對通用鍵值類型優化,提供更靈活的 API 和更高性能。項目地址GitHub 倉庫 : https://github.com/orcaman/concurrent- ⌘ Read more
Golang 程序卡死排查指南
我正在幫助某人設置我的 gokrazy/rsync 實現來同步 RPKI 數據(用於保護 BGP 路由基礎設施),當時我們發現,在特定調用方式下,我的 rsync 接收器會無限期掛起。這個問題很快就解決了,但在這個過程中,我意識到我應該記錄下這些年來我所欣賞的一些 Go 調試技巧!場景:Go 程序掛起———-如果你想跟着實驗,可以構建 gokrazy/rsync 的一個較舊版本,就在修 ⌘ Read more
使用 Golang 編寫 2D 遊戲
Ebitengine 是一款基於 Go 語言的 2D 遊戲開發引擎,提供了簡單易用的 API 和跨平臺的支持,開發者可以通過它輕鬆構建遊戲項目。核心特性——-跨平臺支持 Ebitengine 支持多個平臺,包括 Windows、macOS、Linux,以及 WebAssembly(可運行於瀏覽器中)。這使得開發者可以在不同設備上運行同一個遊戲項目,而無需編寫額外的代碼。易用的 API ⌘ Read more
golang 面試題:Goroutinue 什麼時候會被掛起?
今天我們來聊聊一個在 Go 面試中經常遇到的經典問題:Goroutine 什麼時候會被掛起?如果你是一個 Go 程序員,或者正在準備 Go 相關的面試,可能對這個問題有一些疑問。那麼,就讓我從一個資深程序員的角度,帶你們深入淺出地分析這個問題。💡什麼是 Goroutine?首先,咱們得搞清楚什麼是 Goroutine。簡而言之,Goroutine 就是 Go 中的輕量級線程。它讓我們可以用極低的成 ⌘ Read more
golang 每日一庫之 gocarina-gocsv
一、爲什麼選擇 gocsv?Go 標準庫 encoding/csv 提供了基礎的 CSV 讀寫能力,但在處理複雜業務時常常需要:手動轉換字符串到具體類型 維護列索引與結構字段的映射關係 處理嵌套結構等複雜數據類型 處理可選字段和默認值 gocarina/gocsv 通過結構體標籤實現了聲明式的 CSV 解析,極大簡化了開發流程。最新統計顯示,該庫在 GitHub 已獲得 1 ⌘ Read more
Golang 高性能編程:內存對齊的藝術
有些 Golang 程序運行得像一陣風,而有些卻慢得像在爬坡?答案可能藏在一個不起眼但至關重要的細節裏——內存對齊。今天,我們就來聊聊這個聽起來有點 “硬核”,但其實非常有趣的話題。我會用輕鬆的方式帶你走進內存對齊的世界,分享一些實用技巧和真實案例,讓你的 Golang 程序跑得更快!引言:一次意外的性能提升 ————-那是一個普通的週三下午,我正在優化一個 Golang 項目。 ⌘ Read more
Go 語言 errgroup 庫:強大的併發控制工具
errgroup 是官方 Go 庫 x 中的一個實用工具,用於併發執行多個 goroutine 並處理錯誤。它基於 sync.WaitGroup 實現了 errgroup.Group,爲併發編程提供了更強大的功能。errgroup 的優勢————與 sync.WaitGroup 相比,errgroup.Group 具有以下優勢:錯誤處理:sync.WaitGroup 只負責等待 g ⌘ Read more
context-Context - 構建高可用的 Go 應用
你是否有遇到過這樣的情況:意外的流量激增導致數據庫掛起 系統掛掉,用戶無法訪問 做爲開發人員,你忙於調試問題,事後還會被扣除績效和獎金 不受控制的 goroutines,長時間運行的任務,無響應的 API 這些都會對構建一個高可用的應用造成嚴重影響。這些問題通常源於缺乏適當的上下文管理。無論您是在處理 API 請求、管理數據庫操作,還是構建分佈式系統,掌握上下文都是每個 Go ⌘ Read more
MCP 實戰:使用 Go 快速構建 MCP Server
MCP 簡介MCP 協議(Model Context Protocol,模型上下文協議)是由 Anthropic 於 2024 年 11 月底推出的一種開放標準,旨在統一大型語言模型(LLM)與外部數據源和工具之間的通信。官方地址 https://modelcontextprotocol.io 架構如下 MCP 協議的架構包含多個關鍵組件:Host(宿主程序)、MCP Client(M ⌘ Read more
Go 1-24 新特性:標準庫 os-Root 解析
背景 ——–Go 1.24 已進 release,其版本說明 [1] 中包含了多項新特性。本文將重點解析新增的標準庫 os.Root 功能,它能有效防禦目錄遍歷漏洞(Directory Traversal Vulnerabilities)。目錄遍歷漏洞是典型的安全問題,攻擊者通過提供相對路徑(如 ../../../etc/passwd)誘導程序訪問非授權文件。近期真實案例 CVE- ⌘ Read more
Go 項目目錄結構指南
擁有一個井然有序的目錄結構非常重要,原因有幾個:層次分離:它將項目的不同部分——如業務邏輯、數據訪問和 API 處理——放在各自的文件夾中。這樣,開發人員可以專注於特定領域,而不會感到不知所措或困惑。 更好的組織: 通過整齊地整理你的代碼及其依賴項,較大的項目變得更容易導航。你總是知道在哪裏找到你需要的東西! 可重用性: 一個良好的結構讓你可以創建可以在項目不同部分使用的組件或包,從而 ⌘ Read more
golang 每日一庫 samber-lo
samber/lo 是一個非常流行的 Go 語言庫,它提供了一些常用的函數式編程風格的工具函數,使得 Go 代碼更加簡潔、優雅。該庫的設計理念是減少代碼冗餘,簡化開發過程,尤其是在處理常見的數據結構和算法時。lo 這個庫的名字來源於 “Lazily Optimized” 的縮寫,但它本身並不涉及延遲計算或優化策略。它的目標是提供一系列常見操作的簡便方法,尤其是集合類型(如切片、映射、通道等)的操作 ⌘ Read more
Go 語言之在 Gin 框架中使用 Zap 實現高效日誌管理
在現代 Web 開發中,日誌管理是確保應用程序性能、穩定性和可維護性的關鍵因素之一。Gin 作爲輕量級的 Go Web 框架,自帶了簡單的日誌功能。然而,對於追求高性能和靈活性的開發者來說,Zap 日誌庫是一個理想的選擇。本文將深入探討如何在 Gin 框架中集成 Zap 日誌庫,實現高效、分級和結構化的日誌記錄。本文介紹瞭如何在 Go 的 Gin 框架中使用 Zap 日誌庫替換默認日誌功能,提供更 ⌘ Read more
golang 每日一庫之 pressly-goose
pressly/goose 是一個用於 Go 語言的數據庫遷移工具。它提供了一種簡單且高效的方式來管理數據庫 schema 的版本控制,適用於數據庫結構變更的管理和遷移。goose 的設計目標是讓數據庫遷移更加簡便、安全,並且在多環境下可以輕鬆應用。數據庫遷移通常用於在應用程序中管理數據模式的變化(例如添加表、修改列、刪除索引等),尤其在團隊協作開發、生產環境發佈等情境下,遷移工具幫助開發者和運維 ⌘ Read more
golang 每日一庫之 iancoleman-orderedmap
github.com/iancoleman/orderedmap 是一個 Go 語言庫,提供了一個有序字典(OrderedMap)實現,區別於 Go 語言內建的 map 類型,內建的 map 是無序的。該庫的 OrderedMap 能夠保持元素的插入順序,因此適用於需要按插入順序遍歷元素的場景。主要特點:有序性:OrderedMap 保證元素的插入順序,和內建的 map 類型不同, ⌘ Read more
Go 編程實踐 - Go Context
1、context 包的引入context 包是在 Go 1.7 引入的,它爲在多個 goroutine 之間傳遞請求範圍的上下文信息和控制 goroutine 的生命週期提供了一種標準的方式。2、context 包的主要作用傳遞上下文信息:context 可用於在 goroutine 之間傳遞請求範圍的數據,如請求的認證信息、請求的截止時間、請求的 ID 等。這些信息在 goroutine 之間 ⌘ Read more
golang 每日一庫之 swaggo
Go Swagger(Swaggo)是一個用於 Go 語言的開源工具集,它幫助開發者自動生成 API 文檔。它利用 Go 的註釋和結構體信息,通過解析代碼,生成符合 OpenAPI 規範的文檔。OpenAPI(也稱爲 Swagger)是一個廣泛使用的 API 規範,它使得 API 文檔更加標準化、易於理解和交互。Swaggo 主要的功能包括:1. 自動生成 OpenAPI 文檔Swaggo 通過解 ⌘ Read more
Go 事件驅動架構:從原理到實戰,徹底掌握高併發編程
在 Go 語言的世界裏,如何優雅地處理海量併發請求?事件驅動架構(Event-Driven Architecture, EDA)或許是你需要的答案。 🔥 爲什麼你需要關注事件驅動架構? ———————-在傳統的同步編程模式下,我們通常採用阻塞調用的方式來處理請求。然而,在高併發、高吞吐的場景下,這種方式可能帶來以下問題:線程資源浪費:大量 Goroutine 在 I ⌘ Read more
使用 Go Convey 做 BDD 測試的入門指南
前面在「Go 代碼測試時怎麼打樁?給大家寫了幾個常用案例」中我們介紹了在單元測試中使用gomonkey爲代碼進行打樁的各種方法。今天我們介紹在 Go 單元測試中另外一個很好用的工具庫goconvey,上面說的gomonkey屬於在 Test Double 方面提供能力,也就是我們通常說的mock,用它們可以自定義一套實現來替換項目中的代碼實現。而goconvey則是一個幫助我們組織和管理測試用例的 ⌘ Read more
Retry-Go:Go 優雅重試
在 Go 語言的開發過程中,我們經常需要執行可能失敗的操作,比如網絡請求。如果每次失敗都直接報錯並終止程序,用戶體驗就會很差。通常的做法是重試,即在失敗後等待一段時間再嘗試重新執行。retry-go (github.com/avast/retry-go) 是一個輕量級的 Go 語言重試庫,提供簡單易用的「重試機制」,支持:自定義重試策略(固定間隔、指數回退、隨機回退)。 最大重試次數(避免無 ⌘ Read more
HTTP-2 工作原理與 Go 實戰
在瞭解了上一篇文章的 net/rpc 內容(從 Go 應用中的 net/rpc 到 gRPC)後,現在是時候深入瞭解 HTTP/2 了,它是 gRPC 協議的基礎。HTTP/2 原理及 Go 實戰指南本文偏重理論講解,內容會比較密集。我們主要聚焦 HTTP/2 的核心概念,之後簡要介紹如何在 Go 中啓用它。建議泡杯咖啡,坐下來慢慢看,讓我們一步步拆解這個話題。HTTP/2 優勢——— ⌘ Read more
使用 Go 構建可擴展的 WebAssembly 應用
Go 1.24 通過新增 go:wasmexport 指令和構建 WASI 反應器(Reactor)的能力,顯著增強了其 WebAssembly(Wasm)支持。這些特性使開發者能夠將 Go 函數導出到 Wasm 模塊,實現與 Wasm 主機的深度集成,拓展了 Go 在 Wasm 應用開發中的可能性。WebAssembly 與 WebAssembly 系統接口(WASI)————- ⌘ Read more
golang 每日一庫之 govalidator
govalidator 是一個用 Go 語言編寫的輕量級的驗證庫,提供了豐富的驗證和清理功能,主要用於驗證和清理用戶輸入的數據(如表單數據、API 請求的 JSON 數據等)。它支持常見的數據驗證功能,如電子郵件、URL、IP 地址、信用卡號等的驗證,同時也支持自定義驗證規則。1. 安裝你可以通過 go get 來安裝 govalidator:go get github.com/asaskevic ⌘ Read more
Datatypes:Go 輕鬆支持數據庫 JSON 類型
GORM 是 Go 語言中最流行的 ORM 之一,它簡化了數據庫操作,提升了開發效率。然而,在某些情況下,標準的數據類型無法滿足複雜業務需求。例如,如何將 Go 中的結構體、切片、JSON 等類型映射到數據庫字段?如何方便地進行序列化和反序列化?爲了解決這些問題,GORM 提供了 datatypes (gorm.io/datatypes) 擴展庫,旨在簡化 Go 語言中複雜數據類型與數據庫字段之間 ⌘ Read more
Go 中的實時批處理: 高效數據處理的藝術
開篇:當實時性遇見批量處理 ————–在處理大量數據時,我們通常面臨兩個選擇:單條處理 和 批量處理。前者處理及時,但系統開銷大;後者吞吐量高,但可能增加延遲。那麼,有沒有一種方式能兼顧兩者的優勢?答案是——實時批處理(Real-time Batching)。爲什麼選擇 Go? ————-1.1 天生爲併發而生Go 的 Goroutine 和 Channel 機 ⌘ Read more
golang 面試官:for select 時,如果通道已經關閉會怎麼樣?如果只有一個 case 呢?
今天咱們聊點技術性的東西,具體說一下 Go 語言中的 for select 語句,特別是在面試中經常被問到的兩個問題。題目 1:for select 語句中,如果通道已經關閉了,會怎麼樣?這道題乍一聽簡單,但其實是面試官最喜歡用來考察你是否真正理解 Go 中通道機制的題目之一。假設你在寫一個需要從通道讀取數據的程序,然後突然有人關了通道,你會怎麼處理?程序會怎麼樣?如果你把這個問題想得很簡單,你可 ⌘ Read more
在 go 語言裏用 Redis 如何實現延時任務隊列,如何延時?
在 Go 語言中,使用 Redis 實現延時任務隊列可以通過 Sorted Set(ZSet) 結合 輪詢機制 或 Pub/Sub 實現。以下是詳細實現方案,以及延時任務與定時任務的區別和應用場景分析。一、延時任務隊列的實現(Go + Redis)核心思路存儲結構:使用 Redis 的 Sorted Set(ZSet),以任務的 執行時間戳 作爲分數(Score),任務內容作爲成員(Member) ⌘ Read more
理解 Go 語言中的 Graceful Shutdown 機制
當使用 Go 開發 Web 服務時,實現正確的關機處理對於維護系統可靠性和數據完整性至關重要。優雅關機能確保服務在終止前完成現有操作,而不是突然停止導致任務未完成。核心概念解析——優雅關機需要協調終止信號接收、進行中的操作和資源清理。在 Go 中,通常通過信號處理、goroutine 和基於上下文的取消機制來實現。以下是最小化實現示例:package mainimport ( ”co ⌘ Read more
Go1-24 新特性:OS 新版本要求、Wasm 功能增強、template 支持迭代器等
大家好,我是煎魚。新版本 Go1.24 在 2 月 11 號已經正式發佈,如果先前還沒有留到的同學,可以關注下是否跟進了。先前我們已經更新了多篇新特性介紹。今天將會是最後一篇知識點的收尾。操作系統要求——Linux 內核版本 = 3.2在本次 Go1.24 新版本開始,需要 Linux 內核 3.2 版本或更高版本(劃重點)。如果公司裏的集羣環境歷史底蘊比較深的,建議升級前檢查一下。( ⌘ Read more
分佈式基石算法 一致性 hash
什麼是 一致性 hash 算法—————首先摘抄一段維基百科的定義 一致哈希 是一種特殊的哈希算法。在使用一致哈希算法後,哈希表槽位數(大小)的改變平均只需要對𝐾/𝑛 個關鍵字重新映射,其中 𝐾 是關鍵字的數量,𝑛是槽位數量。然而在傳統的哈希表中,添加或刪除一個槽位的幾乎需要對所有關鍵字進行重新映射。 — wikipedia分佈式系統中, 一致性 hash 無處不在,C ⌘ Read more
Go 1-24 的 omitzero:JSON 處理的福音
使用 omitempty 忽略 JSON 中的可選字段 (Go 1.24 之前)——————————————當你有一個要轉換爲 JSON 的結構體時,你可能有一些字段是可選的。例如,我們採用以下結構體:type Response struct { ID string json:“id” // 其他字段省略 UpdatedA ⌘ Read more
用 Go 語言手撕 DNS 協議:從理論到 gothdns 的工程實踐
在互聯網基礎設施的基石中,DNS(域名系統)堪稱最優雅的分佈式系統設計典範。這個將域名轉換爲 IP 地址的魔法系統,每秒處理着數以億計的查詢請求。Go 語言憑藉其簡潔的併發模型和高效的網絡編程能力,成爲實現 DNS 協議的絕佳選擇。理解 DNS 協議需要把握三個核心要素:分層樹狀結構的域名空間 UDP/TCP 雙協議支持 資源記錄(RR)的二進制編碼規範 Go 語言標準庫中的ne ⌘ Read more
Go 語言反向代理實戰:零壓力承載百萬流量
在現代分佈式系統中,反向代理扮演着數字交通警察的角色。它不僅是客戶端與服務端之間的智能中介,更是系統架構中不可或缺的流量調度中心。典型的應用場景包括:負載均衡:智能分配請求到後端服務器集羣 安全防護:作爲安全邊界過濾惡意請求 協議轉換:統一處理不同通信協議 緩存加速:對靜態資源進行邊緣緩存 服務聚合:整合多個微服務的響應結果 Go 語言憑藉其獨特的併發模型和卓越的性能 ⌘ Read more
Go 語言中如何高效地處理集合
在 Go 語言中,處理集合(如切片、映射等)時,可以通過多種方式提高效率。以下是一些常見的高效處理集合的方法,結合詳細的代碼例子進行講解。1. 使用切片(Slice)代替數組切片是 Go 中常用的集合類型,它比數組更靈活,因爲切片的長度是可變的。package mainimport “fmt”func main() { // 創建一個切片 numbers := []int{1, 2, ⌘ Read more
告別 WebSocket?探索 SSE 爲 Go 應用帶來的全新可能
在現代 Web 應用開發中,實時通信一直是一個重要的需求。傳統上,WebSocket 是實現實時雙向通信的首選方案。然而,隨着技術的發展,Server-Sent Events (SSE) 這一輕量級的單向實時通信技術正在獲得越來越多的關注。本文將深入探討 SSE 技術,並通過實例說明爲什麼在某些場景下它可能比 WebSocket 更適合您的 Go 應用。SSE 是什麼?——–Server ⌘ Read more
Go 併發控制:sync-Map 詳解
我們知道,Go 中的 map 類型是非併發安全的,所以 Go 就在 sync 包中提供了 map 的併發原語 sync.Map,允許併發操作,本文就帶大家詳細解讀下 sync.Map 的原理。使用示例sync.Map 提供了基礎類型 map 的常用功能,使用示例如下:package mainimport (“fmt”“sync”)func main() {var s sync.Map// 存儲鍵值 ⌘ Read more
Go 併發控制 Wait - Cancel
Wait 和 Cancel 兩種併發控制方式,在使用 Go 開發服務的時候到處都有體現,只要使用了併發就會用到這兩種模式。在 Go 語言中,分別有 sync.WaitGroup 和 context.Context 來實現這兩種模式。sync.WaitGroup 等待多個線程完成對於要等待 n 個線程完成後再進行下一步的同步操作的做法,使用 sync.WaitGroup 來等待一組事件:func m ⌘ Read more
Golang Web 單體項目目錄結構最佳實踐
在 Golang 開發 Web 項目的過程中,如何組織目錄結構是一項至關重要的任務。合理的目錄結構不僅能提高代碼的可維護性,還能爲團隊協作提供清晰的代碼規範。今天,我們就來探討一個 Golang Web 單體項目的最佳目錄結構,並通過詳細的代碼示例解析其中的分層設計,以下就是我的最佳實踐方案。爲什麼要設計合理的目錄結構?在 Golang 項目中,代碼的組織方式會影響開發效率和項目的擴展性。如果目錄 ⌘ Read more
Golang 使用反射實現漏洞插件管理
在安全檢測領域,我們經常需要實現一個插件體系,以支持和管理不同類型的漏洞檢測插件。例如,SQL 注入掃描、XSS 檢測等插件應該可以動態加載、統一管理,並按需執行。本文將會介紹如何使用 Golang 反射(reflection) 構建一個可擴展的漏洞檢測插件系統,包括 插件註冊、管理、調用,我會提供完整的 demo 代碼和項目結構來幫助你理清思路。下面就開始我們今天的內容吧!!!🚀🚀🚀項目目錄結構 ⌘ Read more
Go 併發 Bug 殺手鐧:如何正確處理 Goroutines 中的錯誤?
📌 引言—–你是否遇到過這樣的情況:明明 Goroutine 已經執行,但程序結果卻異常? 錯誤似乎消失了,日誌中卻找不到任何線索? Goroutine 發生 panic,主程序卻沒有任何反應? 這些問題的根本原因通常是 Goroutines 中的錯誤處理缺失。如果沒有正確捕獲和處理錯誤,Go 的併發機制可能會讓 Bug 變得難以察覺,甚至導致程序崩潰。本文將深入剖析 G ⌘ Read more
golang 每日一庫之 spf13-viper
spf13/viper 是一個非常流行的 Go 語言庫,主要用於處理應用程序的配置文件。它提供了一種靈活且強大的方式來讀取、解析和管理不同來源的配置數據,比如文件、環境變量、命令行參數等。Viper 以其簡潔、易用以及高度的可定製性在 Go 生態中廣受歡迎。1. Viper 的核心功能Viper 主要用於配置管理,它支持從不同來源加載配置、處理複雜的數據結構、以及提供對配置項的靈活訪問。以下是 V ⌘ Read more
在 Go 中如何將 [][]byte 轉爲 io-Reader ?
起因:在春節前的某一天,我在 ekit 項目的交流羣裏看到大明老師發了這樣一條消息: 各位大佬,問個小問題,有咩有誰用過 byte 轉爲 io.Reader 的東西?我以前搞過一次,但是我忘了是我手搓了一個實現,還是用的開源的,還是 SDK 自帶的並且大明老師還爲此開了一個 issue。看到這條消息,我想起了我在對 Go 還不太熟悉時,曾寫過一個 io.MultiReader 的實現(當時寫完了 ⌘ Read more
解密 Go 語言中的雙生函數:main– 與 init– 的隱祕世界
在 Go 語言的開發實踐中,main()和init()這兩個看似簡單的函數,承載着程序生命週期的核心邏輯。它們如同程序世界的守門人,一個負責搭建舞臺,另一個負責拉開帷幕。本文將通過深度剖析二者的差異,揭示它們在 Go 運行時系統中的運作機制,並提供多個完整代碼示例幫助開發者掌握正確使用姿勢。 函數本質與定位差異———main():程序的唯一入口main()函數是每個可執行 Go 程序的 ⌘ Read more
Go 項目裏的 API 對接,這樣做 Mock 測試才舒服
我們在開發項目的過程中總會遇到要調用依賴方接口的情況,如果依賴方的 API 接口還沒有開發好,通常我們會先約定好 API 接口的請求參數、響應結構和各類錯誤對應的響應碼,再按照約定好請求和響應進行開發。除了上面說的情況外,還有一種就是當你開發的功能需要與微信支付類的 API 進行對接時,因爲各種訂單、簽名、證書等的限制你在開發階段也不能直接去調用支付的 API 來驗證自己開發的程序是否能成功完成對 ⌘ Read more
Golang Option 模式看這一篇就夠了
在 Go 語言中,我們經常需要定義結構體,並通過構造函數初始化它們。然而,Go 不支持默認參數,如果一個結構體有很多可選參數,我們會面臨以下問題:構造函數參數過長,調用時不夠直觀。 需要維護多個 NewXXX 函數,擴展性較差。 代碼可讀性降低。 爲了解決這個問題,Golang 社區廣泛採用 Option 模式,讓我們可以優雅地管理可選參數。本文將詳細講解 Option 模式的 ⌘ Read more
基於 Go 語言構建高性能併發鍵值存儲
在分佈式系統和高併發場景中,鍵值存儲(Key-Value Store)作爲基礎組件扮演着至關重要的角色。本文將通過 Go 語言實現一個線程安全的併發鍵值存儲系統,深入探討其設計原理、性能優化策略以及實際應用場景。 爲什麼選擇 Go 語言?————Go 語言憑藉其原生的併發模型(goroutine 和 channel)、高效的內存管理以及簡潔的語法,成爲構建高性能併發系統的理想選擇。 ⌘ Read more