博客 / 列表

江湖十年 - 萬字解析 Go 官方結構化日誌包 slog

首發地址:https://mp.weixin.qq.com/s/v1nh_WnXq1V8z0WpICdcfA slog 日誌包是 Go 語言中的一個結構化日誌庫,旨在提供一個簡單而強大的日誌系統。因為標準日誌庫 log 過於簡陋,社區中經常有人吐槽,Go 官方也承認了這一點,於是 Go 團隊成員 Jonathan Amsterdam 操刀設計了新的日誌庫 slog,其放在 log/slog 目錄中

日誌 , go , 後端

江湖十年 - 如何基於 Go 語言設計一個簡潔優雅的分佈式任務系統

在當今雲計算與微服務盛行的時代,分佈式任務系統已成為支撐大規模業務的核心基礎設施。今天就來為大家分享下如何基於 Go 語言從零設計和實現一個架構簡潔且擴展性強的分佈式任務系統。 前置概念 本文會設計並實現一個分佈式任務系統,這裏我們要先明確兩個概念。 分佈式:在我們將要實現的分佈式任務系統中,分佈式是指我們的服務可以部署多個副本,這樣才能確保服務更加穩定。 任務:這裏的任務是指異步任務,可能

面試 , 架構設計 , 分佈式系統 , go , 後端

江湖十年 - Go 併發控制:sync.WaitGroup 詳解

首發地址:https://mp.weixin.qq.com/s/-FtDLcHW39vgvqSMUVM-yw 前段時間我在《Go 併發控制:errgroup 詳解》一文中講解了 errgroup 的用法和源碼,通過源碼我們知道 errgroup 內部是使用 sync.WaitGroup 實現的,那麼本文就更進一步,來探索下 sync.WaitGroup 源碼是如何實現的。 使用示例 sync.Wa

面試 , 併發 , 併發編程 , go , 後端

江湖十年 - Go 併發控制:sync.Map 詳解

我們知道,Go 中的 map 類型是非併發安全的,所以 Go 就在 sync 包中提供了 map 的併發原語 sync.Map,允許併發操作,本文就帶大家詳細解讀下 sync.Map 的原理。 使用示例 sync.Map 提供了基礎類型 map 的常用功能,使用示例如下: package main import ( "fmt" "sync" ) func main() {

面試 , 併發 , 併發編程 , go , 後端

江湖十年 - Go 併發編程:如何實現一個併發安全的 map

上週發佈的文章「Go 併發控制:sync.Map 詳解」有讀者反饋説我寫的太難了,上來就挑戰源碼,對新手不夠友好。所以這篇文章算作補充,從入門到進階的順序講解一下在 Go 中如何自己實現一個併發安全的 map。 內置 map 首先,我們來測試一下 Go 語言內置 map 併發安全性,示例如下: https://github.com/jianghushinian/blog-go-example/tr

面試 , 併發 , 併發編程 , go , 後端

江湖十年 - 在 Go 中如何使用分佈式鎖解決併發問題?

在分佈式系統中,協調多個服務實例之間的共享資源訪問是一個經典的挑戰。傳統的單機鎖(如 sync.Mutex)無法實現跨進程工作,此時就需要用到分佈式鎖了。本文將介紹 Go 語言生態中基於 Redis 實現的分佈式鎖庫 redsync,並探討其使用方法和實現原理。 分佈式鎖 首先我們來探討下為什麼需要分佈式鎖?當我們編寫的程序出現資源競爭的時候,就需要使用互斥鎖來保證併發安全。而我們的服務很有可能不

面試 , 分佈式鎖 , 併發 , go , 後端

江湖十年 - Go 源碼是如何解決測試代碼循環依賴問題的?

公眾號首發地址:https://mp.weixin.qq.com/s/j5vKNxl2keMF7oPT5M0XnA 最近我寫了一篇講解 context 包源碼的文章《Go 併發控制:context 源碼解讀》,在閲讀源碼的過程中,我在 context 包測試代碼中發現了一個解決循環依賴的小技巧,在此分享給大家。 x_test.go 解決循環依賴 context 包源碼目錄結構如下: https:/

面試 , 單元測試 , 源碼分析 , go , 後端

江湖十年 - 使用 Uber automaxprocs 正確設置 Go 程序線程數

公眾號首發地址:https://mp.weixin.qq.com/s/5wrYaHXBpuN0WxKAaNNp-A 我們知道 Go 語言沒有直接對用户暴露線程的概念,而是通過 goroutine 來控制併發。不過,在 Go 程序啓動時,其背後的調度器往往是多線程運行的。在 Go 語言的 GMP 調度模型中,P 決定着同時運行的 goroutine 數,我們可以通過環境變量 GOMAXPROCS 或

面試 , 容器技術 , 併發編程 , go , 後端

江湖十年 - Go 語言中你不知道的 io.Discard 妙用

公眾號首發:https://mp.weixin.qq.com/s/no995DjgiS3muyPSt2QhUg 在 Go 語言中,io.Discard 是一個實現了 io.Writer 接口的特殊變量,用於丟棄所有寫入的數據。 io.Discard 在 Go 1.15 及之前版本中是放在 io/ioutil 包中實現的。而在 Go 1.16 版本,得以正式轉正,被實現在 io 包中。本文我們來一起

goland , 編程技巧 , 面試 , go , 後端

江湖十年 - 在 Go 語言中如何實現協程池

公眾號首發:https://mp.weixin.qq.com/s/Xbk4QF7HFll102xaF5r_3Q 如果你熟悉 Java、Python 等編程語言,那麼你一定聽説或者使用過進程池或線程池。因為進程和線程不是越多越好,過多的進程或線程可能造成資源浪費和性能下降。所以池化技術在這些主流編程語言中非常流行,可以有效控制併發場景下資源使用量。 而 Go 語言則沒有提供多進程和多線程的支持,僅提

面試 , 協程 , 併發 , go , 後端

江湖十年 - 一行命令統計代碼行數

公眾號首發:https://mp.weixin.qq.com/s/N1JxiRnr5c4pq0RBo3RGYA 我在網上衝浪時,在 GitHub 上發現了一個感興趣的開源項目 OneX ,我將其下載到本地,現在我該如何知道這個項目的體量呢?一個非常直觀的指標是看這個項目有多少行代碼。 我們可以使用如下命令,來統計 OneX 項目代碼行數: $ cd onex $ find . -name "*.g

命令行 , 面試 , 代碼質量 , go , 後端

江湖十年 - 在 Go 中如何使用有限狀態機優雅解決程序中狀態轉換問題

公眾號首發地址:https://mp.weixin.qq.com/s/r8mqOUIoCu0713XcH3P1-Q 在編程中,有限狀態機(FSM)是管理複雜狀態流轉的優雅工具,其核心在於通過明確定義狀態、事件和轉換規則,將業務邏輯模塊化。本文將探討在 Go 中如何使用有限狀態機。 有限狀態機 在介紹有限狀態機之前,我們可以先來看一個示例程序: https://github.com/jianghus

面試 , 架構設計 , 代碼優化 , go , 後端

江湖十年 - 在 Go 中為什麼推薦使用空結構體作為 Context 的 key

公眾號首發地址:https://mp.weixin.qq.com/s/TGNG34qJTI7SZOENidYBOA 我曾在《Go 中空結構體慣用法,我幫你總結全了!》一文中介紹過空結構體的多種用法,本文再來補充一種慣用法:將空結構體作為 Context 的 key 來進行安全傳值。 NOTE: 如果你對 Go 語言中的 Context 不夠熟悉,可以閲讀我的另一篇文章《Go 併發控制:con

面試 , go , 後端

江湖十年 - Go 官方推薦的 Go 項目文件組織方式

公眾號首發:https://mp.weixin.qq.com/s/JwEPt3oZ3aY8ZzKddwnpiA 剛開始接觸 Go 的開發者大概都會遇到一個問題:我該如何組織我的 Go 項目?這種問題當然沒有標準答案,不過 Go 官方下場,給了廣大 Gopher 一個推薦模板。本文就來帶大家一起來學習一下 Go 官方對於 Go 項目佈局的指導原則。 本文以 Go 官方博客「Organizing a

服務器開發 , 面試 , go , 後端 , Web

江湖十年 - 萬字長文:徹底掌握 Go 1.23 中的迭代器——使用篇

公眾號首發地址:https://mp.weixin.qq.com/s/t47eJ9rYK2CZ-hIbjx7kSg 本文帶大家一起來深入探究一下 Go 1.23 中發佈的迭代器特性,這是一篇遲來的文章,再不寫這篇文章 Go 1.25 就發佈了 :),Go 1.25 預計將於 2025 年 8 月發佈。 由於篇幅過長,所以文章拆分成了上下兩篇發佈,本文為上篇——使用篇。下篇為——原理篇,記得來讀。

面試 , go , 後端

江湖十年 - 如何使用 go:linkname 指令訪問 Go 包中的私有函數

公眾號首發:https://mp.weixin.qq.com/s/nzbuLHfS4Nu2qtcd2bO6-w 在 Go 語言的包設計中,函數和變量通過首字母大小寫來嚴格區分導出(exported)與未導出(unexported)的可見性規則。這種機制是 Go 模塊化設計的基石,但同時也為底層系統級開發帶來了限制。//go:linkname 指令正是 Go 為突破這一限制預留的「後門」,它通過編譯

編譯 , 指令 , 面試 , go , 後端

江湖十年 - 在 Go 中使用 cron 執行定時任務

首發公眾號地址:https://mp.weixin.qq.com/s/bCgGnw9QYTTBuoEktTYZcw 如果你曾經在 Go 中實現過定時任務,可能會發現,原生的 time.Timer 或 time.Ticker 雖然簡單易用,但在複雜的場景下(如多任務調度、時區處理、任務失敗重試等)往往顯得力不從心。這時,一個功能強大且靈活的定時任務庫就顯得尤為重要。 github.com/robfi

定時任務 , 面試 , cron , go , 後端

江湖十年 - Go 併發控制:semaphore 詳解

今天我們來介紹一個 Go 官方庫 x 提供的擴展併發原語 semaphore,譯為“信號量”。因為它就像一個信號一樣控制多個 goroutine 之間協作。 概念講解 我先簡單介紹下信號量的概念,為不熟悉的讀者作為補充知識。 一個生活中的例子:假設一個餐廳總共有 10 張餐桌,每來 1 位顧客佔用 1 張餐桌,那麼同一時間共計可以有 10 人在就餐,超過 10 人則需要排隊等位;如果有 1 位顧客

面試 , 信號量 , 併發編程 , go , 後端

江湖十年 - Go 併發控制:sync.Cond 詳解

公眾號首發地址:https://mp.weixin.qq.com/s/c1C2rv3nGCtnfm2n34K6VQ 在 Go 中因為 channel 的存在,sync.Cond 併發原語並不常用。不過在一些開源組件中還能能見到 sync.Cond 的應用,比如 Kubernetes 用它來實現併發等待隊列,這也是 sync.Cond 的典型應用場景。本文將通過源碼和示例帶你學會 sync.Cond

併發原語 , 面試 , 併發編程 , go , 後端

江湖十年 - Go 併發控制:singleflight 詳解

singleflight 是 Go 官方擴展庫 x 中提供的擴展併發原語,能夠將多個併發請求合併為一個,降低服務端壓力。本文就來介紹下它的用法和實現原理。 請求合併 singleflight 主要用於抑制重複的併發調用,從而避免對同一資源進行重複操作,提升系統性能。 比如,當我們有多個 goroutine 併發調用一個同一個函數時,singleflight 能夠實現只讓一個 goroutine 發

併發原語 , 面試 , 併發編程 , go , 後端

江湖十年 - Go 併發控制:sync.Once 詳解

公眾號首發地址:https://mp.weixin.qq.com/s/ijAjiCdpb7BhRQwEa2BN3Q 在 Go 語言的併發編程中,常常會遇到需要確保某個操作僅執行一次的場景。sync.Once 是 Go 標準庫中的一個簡單而強大的工具,專門用於解決這種需求。本文將深入解析 sync.Once 的使用方法和原理,幫助你更好地理解 sync.Once 在併發控制中的用法。 sync.On

面試 , 併發模型 , 併發編程 , go , 後端

江湖十年 - Go 併發控制:errgroup 詳解

本文公眾號地址:https://mp.weixin.qq.com/s/kqfIPS77B_LWLf5h4dLDGw errgroup 是 Go 官方庫 x 中提供的一個非常實用的工具,用於併發執行多個 goroutine,並且方便的處理錯誤。 我們知道,Go 標準庫中有個 sync.WaitGroup 可以用來併發執行多個 goroutine,errgroup 就是在其基礎上實現了 errgrou

面試 , 併發模型 , 併發編程 , go , 後端

江湖十年 - Go 錯誤處理指北:Defer、Panic、Recover 三劍客

首發地址:https://mp.weixin.qq.com/s/FRa0A51DGQ6MiKO6PUu6wQ Go 語言中的錯誤處理不僅僅只有 if err != nil,defer、panic 和 recover 這三個相對來説不不如 if err != nil 有名氣的控制流語句,也與錯誤處理息息相關。本文就來講解下這三者在 Go 語言中的應用。 Defer defer 是一個 Go 中的關鍵

面試 , 錯誤 , 異常處理 , go , 後端

江湖十年 - Go 錯誤處理指北:如何優雅的處理錯誤?

**公眾號首發地址:https://mp.weixin.qq.com/s/ImvwsAUhQ3MMZkKvnbNB3A 關注公眾號第一時間查看文章更新。** 本文是 Go 錯誤處理指北系列第三篇文章:如何優雅的處理錯誤?作為鋪墊,我在系列的前兩篇文章 Error vs Exception vs ErrNo 和 pkg/errors 源碼解讀 中分別講解了 Go 錯誤處理機制和流行的第三方包

錯誤 , 異常處理 , go , 後端