在兩個大文件中找出相同的記錄,用 golang 如何寫?
在 Go 語言中找出兩個大文件中相同的記錄,可以採用以下策略:思路讀文件:按行逐行讀取兩個文件中的記錄,假設每個文件的每一行代表一條記錄。 使用哈希集合(Set):因爲哈希集合能夠快速判斷某個記錄是否存在,所以我們可以將第一個文件中的記錄放入集合中,之後讀取第二個文件時逐行判斷該記錄是否也存在於集合中。如果存在則是相同的記錄。 性能優化: 如果文件非常大,避免一次性全部加載到內存 ⌘ Read more
什麼是 WebSocket?Go_WebSocket 編程來了!
爲什麼要有 WebSocket?—————-已經有了 HTTP 了爲什麼還要有 WebSocket 呢?因爲,HTTP 的請求只能由客戶端發起,服務器接收。但是,現在想要讓服務器端也可以主動發起請求。那麼使用 HTTP 是無法滿足的。其次,還有一種就是,如果想要監聽服務端發送的請求。那麼,可以讓客戶端始終處於一種輪詢狀態。客戶端每隔一段就發起一個詢問,看一下服務端有沒有請求信息 ⌘ Read more
http 請求超時 ,你用 golang 是如何解決的?
在 Golang 中,當進行 HTTP 請求時,處理超時是很重要的,尤其在網絡不穩定或服務器響應緩慢的情況下。Golang 提供了靈活的方式來處理 HTTP 請求的超時問題。常見的方式有通過設置http.Client的超時屬性、使用上下文(context.Context)進行超時控制,以及使用自定義的http.Transport。解決 HTTP 請求超時的幾種方式1. 使用 http.Client ⌘ Read more
RavenTree:輕量級的 Go HTTP 請求庫,內置重試機制和錯誤處理
RavenTree 是一個輕量級的 Go 庫,旨在通過提供易於使用的接口、內置對各種 HTTP 方法的支持、接受重試處理等功能來簡化 HTTP 請求。它爲開發者提供了一種高效便捷的方式與網絡服務進行交互。RavenTree 的核心功能—————易於使用的接口: RavenTree 提供了一個簡單直觀的 API,可以方便地創建和發送 HTTP 請求。 內置支持各種 HTT ⌘ Read more
Golang 中你應該知道的 noCopy 策略
在 Go 開發中,我們經常遇到 noCopy 這種結構體,並伴隨一個常見的註釋 “must not be copied after first use”。本文將深入探討 noCopy 的作用,以及 Go Vet 如何幫助我們避免潛在的錯誤。sync.noCopy 的作用—————–sync.noCopy 結構體通常與 sync.WaitGroup 等同步原語一起出現,例如:t ⌘ Read more
使用 Redis 和 Golang 解決併發問題
在構建分佈式系統和數據庫(如 Redis)時,併發問題可能會出現。本文將通過一個股票交易的例子,展示如何使用 Redis 和 Golang 來解決這些問題。問題定義—-場景: 構建一個股票交易應用,多個用戶可以同時購買不同公司的股票。每個公司都有一個剩餘的股票數量,用戶只能購買剩餘的股票。代碼:type Repository struct { client goRedis.Client}fu ⌘ Read more
萬字解析 golang netpoll 底層原理
1 基礎理論鋪墊 ======== 1.1 io 多路複用———–在正式開始,我們有必要作個預熱,提前理解一下所謂io多路複用的概念.拆解多路複用一詞,所謂多路,指的是存在多個待服務目標,而複用,指的是重複利用一個單元來爲上述的多個目標提供服務. 聊到 io 多路複用時,我比較希望舉一個經營餐廳的例子——一個餐館在運營過程中,考慮到人力成本,一個服務員往往需要同時爲多名 ⌘ Read more
Go 語言與 SQL 數據庫的交互方式
Go 語言作爲一門簡潔高效的語言,在與關係型數據庫交互方面也擁有着豐富的選擇。本文將深入探討 Go 語言中幾種常見的與 SQL 數據庫交互方式,並通過示例代碼、優缺點分析和擴展知識點,幫助你更好地理解和選擇適合你的方案。Go 語言與 SQL 數據庫交互的常見方式———————Go 語言標準庫提供了database/sql包,它是一個基礎的 SQL 數據庫驅動接口,爲各種 ⌘ Read more
Golang 實用技巧:使用 go-nanoid 高效生成唯一隨機 ID
作爲一名程序員,我們經常會遇到需要生成唯一標識符(ID)的場景。不管是創建用戶 ID、訂單號還是其他需要唯一性的數據,生成隨機且唯一的 ID 是保證系統健壯性的基礎之一。在 Go 語言中,有很多方法可以實現這一功能,今天我想和大家聊聊如何使用 go-nanoid 這個庫來生成隨機的唯一 ID。go-nanoid 是一個 Go 語言庫,用來高效地生成唯一的隨機 ID(類似於 UUID),並且生成的 ⌘ Read more
Gorm 自定義數據類型
在處理數據庫交互時,我們經常會遇到將數據在 Go 結構體和數據庫關係之間來回轉換的需求。今天,我們將深入探討 Gorm 中的自定義數據類型,這是一種強大的工具,可以幫助我們實現靈活的數據映射和自定義邏輯。使用場景:處理軍官等級———–爲了更好地理解自定義數據類型的用途,我們以一個現實的例子來說明:構建一個軟件來存儲和讀取美軍軍官的等級信息。這個例子中,我們定義了兩個結構體:Go 結構 ⌘ Read more
Go 語言併發編程之互斥鎖 sync-Mutex
大家好,我是 frank。「Golang 語言開發棧」公衆號作者。01 介紹Go 標準庫 sync 提供互斥鎖 Mutex。它的零值是未鎖定的 Mutex,即未被任何 goroutine 所持有,它在被首次使用後,不可以複製。我們可以使用 Mutex 限定同一時間只允許一個 goroutine 訪問和修改臨界區。02 使用在介紹怎麼使用 Mutex 之前,我們先閱讀 sync.Mutex 源碼 ⌘ Read more
go:embed 在 Go 開發中的應用與最佳實踐
背景–在使用 Go 開發命令行工具或桌面軟件時,將配置文件、模板,甚至整個前端應用直接嵌入到 Go 二進制文件中是一種提高應用部署效率和簡化操作的有效方法。這種方法可以減少外部依賴,讓應用在沒有額外資源文件的情況下也能獨立運行,特別適合需要便捷分發和部署的場景。自 Go 1.16 版本起,Go 語言官方引入了 //go:embed 指令,使得嵌入靜態資源變得異常簡單而直接。這一新特性大大簡化了 ⌘ Read more
基於反射的輕量級 Go 依賴注入框架
在軟件開發領域,依賴注入(DI)是一種強大的設計模式,它可以幫助我們編寫鬆散耦合、易於測試和維護的代碼。雖然在 Go 語言中,依賴注入的使用不如其他語言(如 Java 或 C#)那麼普遍,但在構建大型、複雜的應用程序時,它仍然可以發揮重要作用。Parsley 就是爲此而生的。它是一個易於使用、基於反射的 Go 依賴注入包,可以無縫地集成到任何 Go 應用程序中。Parsley——-Pars ⌘ Read more
構建 Go RESTful API 的終極指南:Fiber、GORM 和 PostgreSQL
本文將帶你一步步構建一個基於 Go、Fiber 和 GORM 的 RESTful API,並使用 PostgreSQL 作爲數據庫。我們將涵蓋從項目搭建、數據庫配置到 API 路由、認證、授權、錯誤處理等關鍵環節,並附有完整代碼示例和詳細解釋,幫助你快速上手 Go RESTful API 開發。項目搭建—-首先,我們需要創建一個新的 Go 項目並安裝必要的依賴包。 初始化 Go 模塊go mo ⌘ Read more
Golang 實現 IP 地址掃描
你是否想過哪些設備連接到了家裏的 Wi-Fi 網絡?無論是出於安全目的還是單純的好奇心,我們都可以去了解一下家庭網絡中的設備情況。在本文中,我們將介紹如何使用 Go 構建一個簡單的 IP 地址掃描器,它可以掃描家庭網絡並列出所有活動設備。爲什麼要構建 Ip scanner市面上有很多網絡掃描工具,但自己構建網絡掃描工具能讓我們靈活地理解和修改代碼,以滿足需求。此外,這還是學習 Go 網絡編程的好方 ⌘ Read more
如何用 Go 來構建 LLM 應用
隨着大型語言模型(LLM)及其相關工具(如嵌入模型)在過去一年中能力顯著提升,越來越多的開發者考慮將 LLM 集成到他們的應用程序中。由於 LLM 通常需要專用硬件和大量計算資源,它們通常作爲網絡服務打包,提供 API 供訪問。這就是 OpenAI 和 Google Gemini 等領先 LLM 的 API 工作方式;即使是像 Ollama 這樣的自託管 LLM 工具,也將 LLM 封裝在 RES ⌘ Read more
Golang 使用 upx 減少可執行文件的大小
衆所周知,Golang 的編譯速度是非常之快的。在設計 Go 時,編譯速度是一個重要的考慮因素。但是,你是否關注過 Go 編譯代碼後生成的二進制可執行文件的大小?讓我們來看一個簡單的 HTTP 服務的應用示例:import ( ”fmt” ”net/http” ) func main() { // create a http server and creat ⌘ Read more
Go 開發人員開發 WebRTC 的福音
Pion 是 WebRTC API 的純 Golang 實現。開發 WebRTC 應用可以使用該庫,提高開發效率。你可以使用 Pion 去創造一些很棒的東西,以下是一些可以讓你創意源源不斷的想法:發送一個視頻文件到多個瀏覽器,以實現完美同步的電影觀看。 將嵌入式設備上的網絡攝像頭內容發送到瀏覽器,無需額外的服務器。 不需要訂閱發佈,就可以在兩臺服務器之間安全地發送數據。 ⌘ Read more
GVM: Golang 多版本管理利器
本文介紹了 Go Version Manager 的功能和使用方法,介紹瞭如何通過 GVM 在系統上安裝和管理多個 Go 語言版本。原文: GVM: Go Version Manager, for Golang manage multiple versions[1]Go 版本管理器(GVM,Go Version Manager)是一款功能強大的工具,旨在簡化系統中 Go 編程語言不同版本的管理 ⌘ Read more
Go 語言 API 文檔利器:絲襪哥(Swagger)保姆級使用指南大揭祕!
咱們都知道在 API 開發中,文檔是必不可少的一環。swaggo/swag 是一個用於 Go 語言的自動化生成 API 文檔的工具,它可以將代碼註釋轉換爲 Swagger 文檔,方便開發者和用戶理解 API 的使用方法。本文將詳細介紹 swaggo/swag 的使用方式以及它的特性。1. 安裝 Swaggo/Swag先在你的 Go 項目中安裝 swag 命令行工具和 gin-swagger 依賴: ⌘ Read more
構建由大型語言模型(LLM)驅動的 Go 應用程序
隨着過去一年大型語言模型(LLM)及其相關工具(如嵌入模型)的能力顯著增長,越來越多的開發者開始考慮將 LLM 集成到他們的應用程序中。由 於 LLM 通常需要專用硬件和大量的計算資源,它們最常見的形式是作爲提供 API 訪問的網絡服務。這就是領先的 LLM 如 OpenAI 或 Google Gemini 的 API 的工作方式;即使是運行你自己的 LLM 工具,如 Ollama[1],也會將 ⌘ Read more
Go 語言實現 systemctl 管理系統服務
在 Linux 系統中,systemd 已然成爲主流的初始化系統和服務管理器,而 systemctl 命令則是我們與之交互的橋樑。對於 Go 開發者而言,直接使用 Shell 調用 systemctl 固然可行,但難免顯得不夠優雅,並且需要編寫額外的代碼來解析命令輸出。爲解決這一問題,taigrr/systemctl 庫應運而生。它爲 Go 開發者提供了符合習慣用法的 systemctl 綁定, ⌘ Read more
Go 構建一個簡單的負載均衡器
Go–負載均衡器在現代軟件開發中至關重要。作爲開發者你肯定好奇過請求是如何在多個服務器之間分配的,或者爲什麼某些網站即使在高流量時也感覺更快,這就是負載均衡器的作用。沒有負載均衡器在這篇文章中,我們將使用 Go 語言構建一個簡單的應用程序負載均衡器,使用輪詢算法(Round Robin)。這篇文章的目的是一步步理解負載均衡器的內部工作原理。什麼是負載均衡器?負載均衡器是一個系統,它將傳入的網絡流 ⌘ Read more
Golang 中強大的重試機制,解決瞬態錯誤
在分佈式系統和網絡編程領域,優雅地處理瞬態錯誤是構建健壯應用程序的關鍵。重試機制是一種有效的策略,用於應對這些短暫的輕微故障。本文將深入探討如何在 Golang 中創建強大的重試機制,並提供詳細的代碼示例。瞬態錯誤的挑戰——-瞬態錯誤通常發生在網絡操作中,可能包括網絡超時、服務器暫時不可用或其他短暫故障。這些錯誤通常是短暫的,可以通過重試來解決。然而,簡單地重複執行操作並不總是最佳方案,因 ⌘ Read more
使用 Go 語言生成樣式美觀的 PDF 文件
在當今數字化時代,PDF 已成爲一種不可或缺的文檔格式,它能夠在各種平臺上保持一致的顯示效果。然而,使用傳統的編程語言生成 PDF 文件往往是一項繁瑣而複雜的任務。Maroto 的出現爲 Go 語言開發者帶來了福音,它提供了一種簡潔優雅的方式來創建結構清晰、樣式美觀的 PDF 文檔。Maroto 簡介———Maroto 是一個基於 Go 語言的 PDF 生成庫,其靈感來源於 Boots ⌘ Read more
探索 Goja: 一個 Golang JavaScript 運行時
本文探討了 Golang 生態系統中的 JavaScript 運行時庫 Goja[1] 。Goja 作爲一個在 Go 應用程序中嵌入 JavaScript 的強大工具脫穎而出, 在操作數據和提供無需 go build 步驟的 SDK 方面具有獨特優勢。背景: 爲什麼需要 Goja在我的項目中, 在查詢和操作大型數據集時遇到了挑戰。最初, 所有內容都是用 Go 編寫的, 這很高效, 但在處理複雜的 ⌘ Read more
開源免費定時任務管理系統 Gocron
概覽–Gocron 是一個開源免費的定時任務管理系統。它使用 Go 語言開發,是一個輕量級定時任務集中調度和管理系統,用於替代 Linux-crontab,旨在爲開發者及運維人員提供一個高效、輕量級且用戶友好的任務調度解決方案。作爲 Linux-crontab 的現代化替代品,Gocron 不僅繼承了傳統定時任務管理的靈活性,還融入了強大的 Web 界面管理功能,使得任務配置、監控與維護變得前所 ⌘ Read more
Go1-23 新特性:再開後門,可以記錄未捕獲的 panic 和 throw 日誌了!
大家好,我是煎魚。今天繼續給大家分享 Go1.23 的新特性,這一輪裏還是有不小有意思的驚喜的。其中不得不評本文中的這個新變化。必須得來一篇獨立話題來提一下這個事!過去學習寫 Go 時,初學者入門的教程教一定會提到在使用 panic 時,強烈建議要使用 recover。否則在 goroutine 的場景下很容易出問題,也會導致記不來日誌。新版本後,終於有兜底 Go 程序崩潰的日誌記錄方法了!過於感 ⌘ Read more
函數類型的 Range - Go 編程語言
簡介 —–這是我在 2024 年 GopherCon 大會上演講的博客文章版本。函數類型的 range 是 Go 1.23 版本中的一個新語言特性。這篇博文將解釋爲什麼我們要添加這個新特性, 它究竟是什麼, 以及如何使用它。爲什麼?—-自 Go 1.18 以來, 我們已經能夠在 Go 中編寫新的泛型容器類型。例如, 讓我們考慮這個非常簡單的Set類型, 一個基於 map 實現的泛型類型 ⌘ Read more
如何實現限制用戶 1 分鐘內最多請求 1000 次?
在高併發場景下,如何保護你的服務不被海量請求壓垮?限流器是你的不二之選。本文將帶你使用 Go 語言,實現一個高效的限流器,限制每分鐘內用戶的最大請求次數。限流算法的選擇——-常見的限流算法有很多,例如:計數器算法: 設定一個時間窗口,在窗口內對請求進行計數,超過閾值則拒絕請求。 漏桶算法: 將請求想象成水滴,漏桶以固定速率漏水,溢出則拒絕請求。 令牌桶算法: 以固定速率生成令牌 ⌘ Read more
Golang 脫敏擴展包:簡化敏感信息處理的利器
背景在數據處理或清洗項目中,我們經常需要對敏感信息進行脫敏處理。這些敏感信息包括但不限於身份證號、手機號、郵箱地址和銀行卡號等。爲了簡化這類任務,可以編寫一個 Golang 的脫敏擴展包。該包封裝了一些常用的脫敏方法,以便在未來的開發中能更方便地進行敏感信息的處理,確保數據的安全和隱私保護。包地址該脫敏擴展包的代碼託管在 GitHub 上,可以通過以下鏈接訪問和下載:https://github ⌘ Read more
橋接 Rust 和原生 Go
你好,大家好,我是 yuchanns!最近我做了一些有趣的事情,想和你分享:介紹 OpenDAL 作爲 Go 語言的原生綁定。 TLDR; 我將向你展示一種可行的方法,利用 purego 和 libffi 的魔力,從 Rust 和 C 組件構建原生 Go 綁定。什麼是 OpenDAL?————Apache OpenDAL[1] 是一個 Rust 庫,提供了統一的數據訪問層。它爲 ⌘ Read more
Golang 演示 10 種設計模式
作者:knightwwang golang 演示常見的十種設計模式的應用場景。1. 單例模式(Singleton Pattern)單例模式是一種創建型設計模式,它限制了實例化類的對象個數,確保在任何情況下,一個類只有一個實例,並且提供一個全局訪問點。這種模式在需要全局狀態控制或共享資源訪問時非常有用。特點:只有一個實例對象。 必須自行創建實例對象。 必須提供一個訪問該實例的全局訪問點 ⌘ Read more
Golang - 使用 GoFakeIt 生成 Mock 數據
介紹–在軟件開發中,測試至關重要,以確保代碼能夠按預期工作。然而出於隱私考慮、數據可用性以及收集和清理數據,使用真實數據進行測試是不合理的。我們需要生成 Mock 數據來進行測試。在 Go 編程語言中,用於生成假數據的最流行庫之一是 GoFakeIt[1]。什麼是 GoFakeIt?————-GoFakeIt 是一個強大的庫,允許開發人員爲測試目的生成各種隨機數據。它支持創建名字 ⌘ Read more
用 Go 語言構建輕量級 ChatGPT 網頁版
近年來,大型語言模型(LLM)的快速發展徹底改變了人機交互的方式。ChatGPT 作爲其中的佼佼者,憑藉其強大的自然語言處理能力,在各個領域都展現出巨大的應用潛力。然而,對於開發者而言,構建自己的 ChatGPT 應用往往需要耗費大量的時間和資源。Ollama 和 Ollamaweb 的出現爲開發者提供了一個快速構建類 ChatGPT 應用的解決方案。Ollama 是一款開源的 LLM 服務,它支 ⌘ Read more
Go 機器學習框架之火重燃,Google 前研究員開源期望媲美 Jax 的 GoMLX
Go 作爲一門兼具高性能與簡潔性的編程語言,近年來在各種領域得到廣泛應用。然而,在機器學習領域,Go 相比 Python、C++、Julia 等語言,生態仍然較爲薄弱。目前的 Go 機器學習框架無論在功能全面性上,還是在社區生態支持上都難以與 TensorFlow、PyTorch、Jax 等重量級框架抗衡。究其原因,筆者覺得還是 Go 社區缺少熟悉和精通機器學習方面的人才。不過,隨着時間的推移,總 ⌘ Read more
Go 語言實現 Windows 守護進程
在 Windows 系統中,守護進程(Windows Service)扮演着不可或缺的角色,默默地執行着後臺任務,保障着系統的穩定運行。本文將深入探討如何利用 Go 語言簡潔高效地構建 Windows 守護進程,並輔以詳細的代碼示例,助你輕鬆掌握這一實用技能。Windows 守護進程:幕後的無名英雄——————–不同於我們日常使用的應用程序,Windows 守護進程沒有華 ⌘ Read more
Go 熱重載:使用 Air 改變你的開發流程
在 Go 語言開發中,每次修改代碼後都需要手動重啓服務,這無疑是一件效率低下的事情。本文將介紹一款名爲 Air 的工具,它可以幫助我們實現 Go 代碼的熱重載,從而極大地提升開發效率。手動重啓的煩惱——-假設我們有一個運行中的 Go 程序,例如:go run main.go該程序可能使用 fsnotify 來監聽配置文件的變化,例如 config.json:{ ”dbhost”: ”lo ⌘ Read more
Golang 實現帶過期時間的單機鎖
單機鎖要實現的目標:加鎖:會記錄一個鎖的擁有者 owner 解鎖:只有鎖的擁有者才能解鎖 如果有設定鎖的超時時間,到時間自動解鎖(避免忘記解鎖) 代碼很簡單,直接貼源碼。相信聰明的你一看就懂項目地址: https://github.com/gofish2020/expiredlockpackage expiredlockimport ( “bytes” “context” “fm ⌘ Read more
Go 語言函數的幕後:從符號表到棧幀
Go 函數是構建 Go 程序的基本模塊,我們每天都在使用它們,但你是否想過 Go 函數在編譯和運行時是如何工作的呢?本文將深入探討 Go 函數的內部機制,從符號表到棧幀,揭示 Go 函數運行的奧祕。函數的命名和符號表———在 Go 中,每個函數都有一個唯一的名稱,這是因爲 Go 編譯器會創建一個符號表來記錄所有變量和函數的名稱。當我們在代碼中定義一個函數時,它的名稱會被添加到符號表中。 ⌘ Read more
如何在 Go 中構建可插拔的庫
什麼是 go buildmode=plugin?————————go buildmode=plugin 選項允許開發者將 Go 代碼編譯成共享對象文件。另一個 Go 程序可以在運行時加載該文件。當我們想在應用程序中添加新功能而又不想重建它時,這個選項非常有用。可以將新功能作爲插件加載。Go 中的插件是編譯成共享對象(.so)文件的軟件包。可以使用 Go 中的 plu ⌘ Read more
Go 協程上下文切換的代價
在高併發場景下,Go 語言的協程 (Goroutine) 以其輕量級、高效的特性而聞名。但協程的上下文切換真的像想象中那樣輕量級嗎?它在性能上究竟有多大的優勢?本文將深入探討 Go 協程的上下文切換機制,分析其效率和潛在的代價。協程上下文切換的效率———-與傳統的線程相比,Go 協程的上下文切換髮生在用戶空間,避免了昂貴的系統調用,因此切換速度更快。實驗表明,Go 協程的上下文切換平均 ⌘ Read more
Builder 模式在 Go 語言中的應用
Builder 模式是一種創建型模式,即用來創建對象。Builder 模式,中文翻譯不太統一,有時候被翻譯爲建造者模式或構建者模式,有時候也被翻譯爲生成器模式。爲了不給讀者造成困擾,我還是直接叫它 Builder 模式好了。《設計模式:可複用面向對象軟件的基礎》 一書中對 Builder 模式的意圖闡明如下: 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。經典 Bui ⌘ Read more
Go 項目結構的簡潔實現
今天分享一個在 GitHub 上有 3.5k stars 的 Go 項目:go-backend-clean-arch[1]。該項目展示了一個 Golang 後端項目如何設計優雅的項目結構。項目架構——-3.Directory Explanation———————–.├── Dockerfile # Image file├── api│ ⌘ Read more
Go 程序如何實現優雅退出?來看看 K8s 是怎麼做的——下篇
K8s 的優雅退出現在,我們已經掌握了 Go 中 HTTP Server 程序如何實現優雅退出,是時候看一看 K8s 中提供的一種更爲優雅的優雅退出退出方案了😄。這要從 K8s API Server 啓動入口說起: https://github.com/kubernetes/kubernetes/blob/release-1.31/cmd/kube-apiserver/apiserver.gof ⌘ Read more
Go 程序如何實現優雅退出?來看看 K8s 是怎麼做的——上篇
在寫 Go 程序時,優雅退出是一個老生常談的問題,也是我們在微服務開發過程中的標配,本文就來介紹下工作中常見的幾種優雅退出場景,以及帶大家一起來看一下 K8s 中的優雅退出是怎麼實現的。優雅退出我們一般可以通過如下方式執行一個 Go 程序:$ go build -o main main.go$ ./main如果要停止正在運行的程序,通常可以這樣做:在正在運行程序的終端執行 Ctrl + C。 ⌘ Read more
golang 日誌打印 如何添加 goroutinei
在 Go 語言中,標準庫沒有直接提供獲取 goroutine ID 的功能,因此,如果我們想在日誌中添加 goroutine ID,需要藉助一些非標準的方式來實現。方法 1: 通過第三方庫(如 github.com/petermattis/goid)github.com/petermattis/goid 是一個常用的第三方庫,它可以幫助我們獲取當前 goroutine 的 ID。我們可以通過它來實 ⌘ Read more
Golang 面試題:strings 和 strconv 包
作爲一種基本數據結構,每種語言都有一些對於字符串的預定義處理函數。Go 中使用 strings 包來完成對字符串的主要操作。4.7.1 前綴和後綴———–HasPrefix 判斷字符串 s 是否以 prefix 開頭:strings.HasPrefix(s, prefix string) boolHasSuffix 判斷字符串 s 是否以 suffix 結尾:strings.HasS ⌘ Read more
一款支持自動流水線和客戶端緩存的 Go 語言 Redis 客戶端
Rueidis 是一款高性能的 Go 語言 Redis 客戶端,它支持自動流水線操作和服務端輔助客戶端緩存等功能。Rueidis 的目標是提供一個簡單易用、性能卓越的 Redis 客戶端庫,以滿足 Go 開發者的各種需求。主要功能—-自動流水線操作,提升非阻塞命令的執行效率 服務端輔助客戶端緩存,大幅降低延遲和提高吞吐量 支持泛型對象映射和客戶端緩存 提供緩存策略模式(Cac ⌘ Read more
Viper:強大的 Go 配置解析庫
1 介紹Viper (https://github.com/spf13/viper) 是適用於 Go 應用程序的完整配置解決方案。它被設計用於在應用程序中工作,並且可以處理所有類型的配置需求和格式。目前 Star 26.6k, 它支持以下特性:設置默認值 從 JSON、TOML、YAML、HCL、envfile 和 Java properties 格式的配置文件讀取配置信息 實時監控和 ⌘ Read more
瞭解 Golang 中的內存管理:Stack vs Heap
內存管理是編程的一個重要方面,瞭解內存管理的工作原理會極大地影響應用程序的性能和效率。在 Golang 中,內存分配主要通過兩個區域進行管理:棧和堆。在本文中,我們將探討堆棧和堆內存的區別、Golang 如何處理這些分配,並提供實際示例來說明這些概念。Stack堆棧是什麼?堆棧是以後進先出(LIFO)方式運行的內存區域。它用於存儲局部變量和函數調用信息,如返回地址、參數和局部變量。堆棧因其後進先出 ⌘ Read more
你知道 golang 中 sysmon 有什麼作用嗎?
在 Go 語言的運行時 (runtime 包) 中,sysmon 是一個系統監視器 (system monitor) 線程,它在 Go 運行時中扮演着非常重要的角色。sysmon 的主要職責是維護 Go 程序的健壯性和響應性,確保垃圾回收 (Garbage Collection, GC)、搶佔調度 (Preemptive Scheduling)、定時器 (Timers) 和一些其他後臺任務能夠及時 ⌘ Read more
Golang 高併發應用中的數據庫連接死鎖
在構建高併發的 Go 應用時, 數據庫連接池的使用是不可或缺的。然而, 如果使用不當, 連接池也可能成爲性能瓶頸, 甚至導致整個應用陷入死鎖。本文將深入探討 Golang 中數據庫連接死鎖的原因、影響以及解決方案, 幫助開發者構建更加健壯的應用程序。數據庫連接池的工作原理———–在深入討論連接死鎖之前, 我們需要先了解數據庫連接池的工作原理。連接池本質上是一個連接的緩存, 它可以避免 ⌘ Read more
Go 語言什麼時候該使用指針?指針使用的分析與講解
什麼是指針 我們都知道,程序運行時的數據是存放在內存中的,每一個存儲在內存中的數據都有一個編號,這個編號就是內存地址。我們可以根據這個內存地址來找到內存中存儲的數據,而內存地址可以被賦值給一個指針。我們也可以簡單的理解爲指針就是內存地址。指針的聲明和定義 在 Go 語言中,獲取一個指針,直接使用取地址符 & 就可以。 示例:func main() { name := ”Go語言圈” na ⌘ Read more
Go: string 和 bytes 四種轉換方式的性能比較
昨天公司羣中同事提到 Go 1.22 中 string 和 bytes 的互轉不需要再用 unsafe 那個包了,直接轉就可以。我翻看了 Go 1.22 的 release notes 沒找到相應的介紹,但是大家提到了 kubernetes 的 issue[1] 中有這個說法: As of go 1.22, for string to bytes conversion, we can repla ⌘ Read more
沒有什麼不可能:修改 Go 結構體的私有字段
在 Go 語言中, 結構體 (struct) 中的字段如果是私有的, 只能在定義該結構體的同一個包內訪問。這是爲了實現數據的封裝和信息隱藏, 提高代碼的健壯性和安全性。但是在某些情況下, 我們可能需要在外部包中訪問或修改結構體的私有字段。這時, 我們可以使用 Go 語言提供的反射 (reflect) 機制來實現這一功能。即使我們能夠實現訪問,這些字段你沒有辦法修改,如果嘗試通過反射設置這些私有字段 ⌘ Read more
Go 語言的流式處理特性進行高效的 HTTP 請求
在 Go 語言中,當你發起一個 HTTP 請求時,可以通過多種方式來將數據寫入請求的body部分。如果你要處理大型數據或者需要逐步生成請求體數據而不想一次性加載到內存中,可以使用流式寫入的方式。這裏我們會討論如何使用io.Reader接口來實現 HTTP 請求體的流式寫入。1. 基礎概念在 Go 語言的 HTTP 庫中,HTTP 請求的Body字段是一個io.Reader接口。因此,你可以通過實現 ⌘ Read more
Go 語言構建可擴展的 Worker Pool
在當今數據驅動的世界中,應用程序需要快速高效地處理大量請求。併發處理通過允許程序同時執行多個任務,成爲解決這一需求的關鍵。Go 語言以其強大的併發原語而聞名,爲構建高性能、可擴展的應用程序提供了優雅而有效的方法。本文將深入探討併發處理的概念,並提供使用 Go 語言構建可擴展 Worker Pool 的分步指南。併發處理:性能和效率的強大工具—————併發處理涉及程序內多個任務的 ⌘ Read more
圖解 Go 語言 time-Sleep 的實現原理
我們寫程序的時候,一定遇到過需要讓程序休眠一段時間再執行的場景,這個時候我們一般會想到用 Sleep 方法,Java 語言有Thread.Sleep, PHP 應該是有一個sleep函數,同樣的 Go 語言有內置的 time.Sleep 方法。這篇文章我們來簡單梳理一下,Go 語言的time.Sleep是怎麼實現程序的休眠和喚醒的。在 Go 的程序中,使用time.Sleep(d duration ⌘ Read more
通過 Go 示例理解函數式編程思維
一個孩子要嘗試 10 次、20 次才肯接受一種新的食物,我們接受一種新的範式,大概不會比這個簡單。– 郭曉剛 《函數式編程思維》譯者函數式編程 (Functional Programming, 簡稱 fp) 是一種編程範式,與命令式編程(Imperative Programming)、面向對象編程(OOP)、泛型編程(Generics Programming)、邏輯編程 (logic Pro ⌘ Read more
從源代碼中窺探 Go 的 WaitGroup 實現和應用
sync.WaitGroup OverviewGo 作爲雲原生開發的代表,以其在併發編程中的易用性而聞名。在大多數情況下,人們會在處理併發時使用 WaitGroup。我經常想要了解它是如何工作的,所以本文主要談談我對 WaitGroup 的理解。在 Go 語言中,sync.WaitGroup 允許主程序或其他 goroutines 在繼續執行之前等待多個 goroutines 執行完畢。它主要用於 ⌘ Read more
一文搞定 Golang 反射 -Reflect-
Go (Golang) 中的反射是一項強大的功能,它允許程序在運行時檢查自身的結構和值。這一功能由 reflect 包提供。反射通常用於序列化 / 反序列化、構建泛型庫和測試等任務。本文將概述反射在 Go 中的工作原理,並提供實際示例。基本概念Type: 值的類型,(如 int、string、float、struct)。 Value: 變量的實際數據。 kind: 類型的具體類別(如 ⌘ Read more
golang 做 api 開發離不開簽名驗證- 如何設計?
在 API 開發中,簽名驗證是一種常見的安全措施,用於確保請求的完整性和來源的可靠性。以下是設計一個簽名驗證機制的步驟和示例代碼。設計思路密鑰管理:爲每個客戶端分配一個唯一的 API 密鑰和 API 密鑰。 簽名生成:客戶端在請求 API 時,使用預定義的算法生成簽名,並將簽名和其他必要參數(如時間戳、隨機數等)一起發送到服務器。 簽名驗證:服務器接收到請求後,根據相同的算法重新生成簽 ⌘ Read more
在 golang 裏使用 ZooKeeper,如何使用
在 Go 語言中使用 ZooKeeper,可以藉助第三方庫go-zookeeper。下面介紹如何安裝和使用這個庫與 ZooKeeper 進行交互。安裝 go-zookeeper 庫首先,需要安裝go-zookeeper庫。使用go get命令來安裝:go get github.com/samuel/go-zookeeper/zk使用 ZooKeeper 的基本示例以下是一個簡單的示例,包括連接 Z ⌘ Read more
適配器模式在 Go 語言中的應用
前段時間我負責對一個項目進行臨時性的技術方案改造,用到了適配器模式,今天就來跟大家簡單分享下適配器模式在 Go 語言中的應用。適配器模式適配器模式(Adapter Pattern)是 23 種經典設計模式中的一種,屬於行爲型模式,它允許不兼容的接口協同工作。該模式通過創建一個適配器類,封裝不兼容的接口,並對外提供一個兼容的接口。《設計模式:可複用面向對象軟件的基礎》一書中對適配器的意圖定義如下: ⌘ Read more
用 Go 語言構建優雅的事件驅動架構
事件驅動架構(EDA)作爲一種強大的軟件設計模式,在構建現代分佈式系統中扮演着越來越重要的角色。它通過異步事件流將不同的服務和組件解耦,從而提升系統的可擴展性、彈性和響應能力。在 Go 語言中,其簡潔的語法和豐富的併發原語爲實現高效的 EDA 提供了天然的優勢。事件驅動架構的核心概念———–在深入探討如何使用 Go 語言構建 EDA 之前,我們先來回顧一下事件驅動架構的核心概念:事件 ⌘ Read more
Go1-23 新特性:花了近 10 年,time-After 終於不泄漏了!
大家好,我是煎魚。好多年前,我寫過 timer.After 的使用和坑。Go 這麼多年以來這塊一直有內存泄露。有的同學或多或少都有遇到過。最近 Go1.23 即將正式發佈,Go 核心團隊負責人 rsc 自述花了將近 10 年的努力,終於把這個問題修復了。值得我們關注!timer.After 是什麼—————這是之前編寫的部分,我測試驗證了下。在 Go1.22 依然有效,仍然是有 ⌘ Read more
在 Go 中如何使用反射實現簡易版 encoding-json
在使用 Go 語言開發過程中,我們經常需要實現結構體到 JSON 字符串的序列化(Marshalling)或 JSON 字符串到結構體的反序列化(Unmarshalling)操作。Go 爲我們提供了 encoding/json 庫可以很方便的實現這一需求。在本文中,我們將探索如何使用 Go 的反射機制自己來實現一個簡易版的 encoding/json 庫。這個過程不僅能幫助我們理解序列化和反序列化 ⌘ Read more
Go 還是 TinyGo?
什麼是 TinyGo?TinyGo 與 Go 有何不同? TinyGo 與 Go 相比性能如何?什麼是 TinyGo?———–TinyGo 不是另一種編程語言。它只是 Go 語言的一個編譯器。關鍵區別在於 TinyGo 編譯器創建的二進制文件更小, 主要用於嵌入式系統和 WASM。而 Go 編譯器則用於編譯完整的服務器端應用程序和通用程序。TinyGo 使用 LLVM 作爲後端, 與 ⌘ Read more
你是如何用 Go 語言 配置高性能 sql-DB 的?
配置高性能的 sql.DB 是 Go 應用程序開發中一個重要的環節,特別是在需要處理大量數據庫查詢的情況下。以下是一些最佳實踐和配置建議:1. 數據庫連接池的配置Go 的 database/sql 包提供了連接池的功能,您可以通過設置最大空閒連接、最大打開連接數和連接的最大生命週期來優化連接池。db, err := sql.Open(“mysql”, ”user:password@tcp(127. ⌘ Read more
Lambda-Go:將函數式編程引入 Go
函數式編程是編程範式當中的一種,喜歡的人愛之如命,不喜歡的人嗤之以鼻,以簡單高效著稱的 Go 天然在函數式編程上有自己的優勢。Lambda-Go[1] 是一個旨在將受 Haskell 啓發的函數式編程技術引入 Go 生態系統的庫。在本文中,我們將探討 Lambda-Go 的功能,以及它如何增強你的 Go 編程體驗。Lambda-Go 簡介Lambda-Go 是一個 Go 庫,它通過函數式編程結構擴 ⌘ Read more
Go 異步編程小技巧
我們通過一個簡單的例子看一下 Goroutine 的使用func main() { go func() { fmt.Println(“Goroutine started”) // do some work fmt.Println(“Goroutine finished”) }() // wait for Goroutine to fini ⌘ Read more
Go 語言定時任務 time-Sleep 和 time-Tick 的優劣對比分析
golang 寫循環執行的定時任務,常見的有以下三種實現方式 1、time.Sleep 方法:for { time.Sleep(time.Second) fmt.Println(“我在定時執行任務”)}2、time.Tick 函數:t1:=time.Tick(3time.Second)for { select { case <-t1: fmt.Println(“t1定時 ⌘ Read more
Golang - range 迭代器揭祕
簡介我們正在使用 Go 語言編寫 Dolt[1] ,這是世界上第一個版本控制的 SQL 數據庫。像大多數大型 Go 代碼庫一樣,我們有很多需要迭代的集合類型。 Go 1.23 的新特性 [2] 中,你現在可以使用 range 關鍵字來迭代自定義集合類型。這是如何工作的? 這是個好主意嗎? 讓我們深入探討一下。如果你想運行本教程中的任何代碼,你需要 安裝 Go 1.23 發佈候選版 [3] ,或者在 ⌘ Read more
使用 Go 語言創建你的第一個 2D 遊戲
Pixel 是一個用 Go 語言編寫的 2D 遊戲開發庫, 它爲開發者提供了一套簡潔而強大的工具, 讓創建像素風格的遊戲變得輕而易舉。本文將深入探討 Pixel 庫的核心特性, 並通過豐富的示例來展示如何使用它來構建引人入勝的 2D 遊戲。Pixel 的誕生與理念————Pixel 誕生於開發者對簡單而高效的 2D 遊戲開發工具的渴望。它的設計理念是 “手工打造”, 這意味着庫的每 ⌘ Read more
Genkit:新一代基於 Go 的 AI 應用開發框架
Google 推出了 Genkit for Go,這是一個開源框架,用來以 Go 語言原生構建 AI 應用與雲服務。該項目是 Google Firebase 和 Go 團隊聯手合作的最新成果。Genkit for Go 於 7 月 17 日正式推出,目前版本處於 alpha 階段。Gophers 能夠通過它將 Go 的性能和併發優勢與 Genkit 的庫和工具相結合,從而來構建生成式 AI 應用程 ⌘ Read more
Golang 面試題:原子操作和鎖
1、問題描述原子操作和鎖的區別是什麼?2、問題解答原子操作和鎖是併發編程中常用的兩種同步機制,它們的區別如下:1、作用範圍:原子操作(Atomic Operations):原子操作是一種基本的操作,可以在單個指令級別上執行,保證操作的原子性。原子操作通常用於對共享變量進行讀取、寫入或修改等操作,以確保操作的完整性。 鎖(Lock):鎖是一種更高級別的同步機制,用於保護臨界區(Critical ⌘ Read more
構建並運行 eBPF 應用 - Part 2
在上一篇文章中,我們用 C 語言創建了一個 eBPF 程序,以瞭解某個進程使用 CPU 的時間。這些數據隨後被存儲在 BPF HashMap 中。但這是一個不斷更新的短期存儲位置,數據的壽命很短…… 我們該如何利用這些數據呢?這就是用戶空間程序的用武之地。用戶空間程序不在內核空間運行,但可以附加到 eBPF 程序並訪問 BPF HashMap。現在讓我們來看看如何用 Golang 編寫用戶 ⌘ Read more
Go 語言的 Lodash 風格庫
在 JavaScript 的世界裏,Lodash 是一個家喻戶曉的工具庫,它提供了豐富的函數,方便開發者操作數組、對象、字符串等等。Lodash 極大地提高了 JavaScript 開發者的效率,也讓代碼更加簡潔易讀。在 Go 語言 1.18 版本之前,由於缺乏泛型,我們很難實現像 Lodash 這樣功能強大且類型安全的工具庫。然而,隨着 Go 1.18 泛型的引入,這一切都發生了改變。sambe ⌘ Read more
Golang 實現坦克世界
Golang 實現坦克世界項目地址: https://github.com/gofish2020/tankgame 歡迎 Fork && Star遊戲效果—-本項目基於遊戲引擎 Ebitengine 開發,這裏有很多的實例 https://ebiten-zh.vercel.app/examples/ 便於邊學邊用程序下載到本地,直接 go run main.go即可看效果。開發使用的go1.2 ⌘ Read more
在 Go 中如何使用 go:embed 指令嵌入靜態文件
有時候,將配置文件、模板甚至整個前端應用直接嵌入到 Go 二進制文件中,是一種提高應用部署效率和簡化操作的有效方法。自從 Go 1.16 版本起,Go 語言官方引入了 //go:embed 指令,這使得嵌入靜態資源變得異常簡單而直接。本文將詳細介紹如何在你的 Go 應用中使用這一強大的特性。什麼是 go:embed//go:embed 在 Go 1.16 版本中被加入,這也是我接觸 Go 語言的第 ⌘ Read more
理解並使用 Golang 的 “omitempty” 特性
在使用 Go (Golang) 並將數據編碼爲 JSON 時,您可能會遇到這樣的情況:如果某些字段的值爲空,則需要從編碼輸出中省略這些字段。這就是 Golang 的 omitempty 功能發揮作用的地方。struct 字段標記中的 omitempty 選項會告訴編碼器,如果字段爲空值,則跳過該字段。什麼是 “Empty Value”?在 Go 中,Empty Value 的定義是:布爾類型爲 ⌘ Read more
構建並運行 eBPF 應用 - Part 1
本文將介紹如何使用 C 和 Golang 編寫第一個 eBPF 程序。我們將在第一部分介紹實際的 eBPF 程序,在第二部分介紹用戶空間應用程序。準備工作本文開發所運行的操作系統是:OS: Ubuntu 22.04Linux Header Version: 6.5.0–14-generic還通過 apt 安裝了一些依賴項:sudo apt-get -y install libbpf bpfcc-t ⌘ Read more
通過實例理解 Go 訪問和操作數據庫的幾種方式
關係數據庫操作是 Go 應用開發中的重要一環,尤其是 Go Web 應用、微服務等。作爲 Gopher,我們需要了解幾種主流的數據庫訪問和操作方法,以便在項目中做出適當的選擇。我個人在日常開發中較少涉及 CRUD 類應用,因此使用 Go 訪問和操作數據庫的機會並不多,在這方面也算是有一些 “短板”。通過在這篇文章中對數據庫訪問方式進行全面的梳理,我也算是補全一下技能樹,同時也能爲讀者小夥伴提供一些 ⌘ Read more
Go 語言的 Web 開發利器:Templ - HTMX 打造交互式體驗
在 Web 開發領域,Go 語言以其簡潔、高效和強大的併發能力著稱。Templ 和 HTMX 則是與 Go 完美契合的工具,它們分別負責頁面的渲染和交互邏輯,共同打造出現代化的 Web 應用。本文將深入探討 Templ 和 HTMX 的核心概念、使用方法以及如何結合 Go 語言構建出色的 Web 應用。Templ:Go 語言的模板引擎—————-Templ 是 Go 語言自帶的 ⌘ Read more
在 Go 項目中使用 Redis 的幾個實用建議
今天來聊一聊 Redis,主要是聊一些在 Go 項目中使用 go-redis 代碼上的一些建議。在上代碼之前我還是要廢話幾句,在大家開發需求用到 Redis 時一定要多想個兩分鐘 “我是不是把 Redis 當數據庫用了?” 因爲數據在數據庫和 Redis 裏存兩份就就得考慮它們的一致性怎麼維護,賊麻煩,而這個一致性不做上線後還經常會出 BUG,所以不是必要我一般不用 Redis。需要過期的數據肯定 ⌘ Read more
全面掌握 Go 語言 errors 標準庫:使用指南與源碼深度解析
前言–在 Go 語言中,錯誤處理是一個重要的部分。Go 官方提供了一個輕量級的 errors 標準庫,用於創建和處理錯誤。本文將介紹如何使用 Go 的 errors 標準庫,並深入解析其源碼實現。準備好了嗎?準備一杯你最喜歡的咖啡或茶,隨着本文一探究竟吧。 Go 版本:1.22.0error 接口——–下面的內容會提到 error 接口,因此我們有必要先了解一下 error 接口的相 ⌘ Read more
Go 語言實現 Base64、Base58 編碼與解碼,很簡單
在 Go 語言中,實現 Base64 和 Base58 編碼與解碼是非常常見的任務。Go 標準庫中已經包含了 Base64 的編碼與解碼函數,而 Base58 需要使用第三方庫來實現。下面分別介紹 Base64 和 Base58 編碼與解碼的實現方法。Base64 編碼與解碼Go 標準庫的encoding/base64包提供了 Base64 編碼與解碼的功能。示例代碼package mainimp ⌘ Read more
Go 1-23 的 os-CopyFS:告別第三方庫,輕鬆複製目錄
在 Go 1.23 版本中,標準庫 os 包引入了一個名爲 CopyFS 的新函數,它提供了一種僅使用標準庫函數即可複製目錄的便捷方法。從此,開發者無需再依賴第三方庫來完成這項常見任務。本文將深入探討 os.CopyFS 函數的功能、用法以及其帶來的優勢。告別第三方庫——在 os.CopyFS 出現之前,Go 開發者通常需要藉助第三方庫(如 github.com/otiai10/copy) ⌘ Read more
Gaby - Golang 社區機器人
Gaby 是一個實驗性的新機器人, 在 Go 問題跟蹤器中以 @gabyhelp[1] 的身份運行, 試圖自動化各種機器可以合理完成的瑣碎事務, 同時也試圖發現機器可以合理完成的新事物。gaby 這個名字是 “Go AI Bot” 的縮寫, 因爲這個實驗的目的之一是瞭解 LLM 可以有效用於哪些方面, 包括識別它們不應該用於哪些方面。一些 gaby 功能將涉及 LLM; 其他功能則不會。指導原則是 ⌘ Read more
「Go 開源」freeze:一個能將源代碼轉換成圖片的工具
大家好,我是漁夫子。今天給大家推薦的開源工具是 freeze,該工具可以將源代碼或終端中的輸出內容轉換成對應的圖片。如下圖效果:比如,我們想把一個 go 語言編寫的源代碼 main.go 轉換成圖片,則可以按如下方式操作:freeze main.go –output main.png生成的效果如下:你看,就把對應的代碼按照高亮的形式生成了圖片。實現原理那這個 freeze 的實現原理是什麼呢?通 ⌘ Read more
一款用於實時監控 PostgreSQL 數據變化的 Go 語言庫
在現代應用開發中,實時數據處理扮演着至關重要的角色。實時監控數據庫變化,並對這些變化做出迅速響應,是許多應用場景(如實時數據分析、緩存更新、事件驅動架構等)的核心需求。Flash 正是這樣一款應運而生的 Go 語言庫,它爲開發者提供了便捷高效的方式來管理 PostgreSQL 數據庫的實時變化。Flash 簡介——–Flash 是一款輕量級的 Go 語言庫,它利用事件管理機制,實現了對 ⌘ Read more
Go 性能度量利器,完全替代 io-Reader 和 io-Writer!
在 Go 語言的世界裏,io.Reader 和 io.Writer 接口是數據流處理的基石。然而,標準庫並沒有提供一種便捷的方式來追蹤通過這些接口傳輸的字節數。metered-io 庫應運而生,它提供了 io.Reader 和 io.Writer 的替代品,並能夠方便地獲取傳輸的字節總數,爲性能度量和監控提供了強大的支持。metered-io 庫簡介————–metered-io ⌘ Read more
聊聊 go 語言對於 socket 的抽象
寫在文章開頭——go語言對於網絡抽象做了非常通用且高性能的封裝,所以就從net包源碼入手介紹一下go語言對於socket的抽象。Hi,我是 sharkChili ,是個不斷在硬核技術上作死的 java coder ,是 CSDN 的博客專家 ,也是開源項目 Java Guide 的維護者之一,熟悉 Java 也會一點 Go ,偶爾也會在 C 源碼 邊緣徘徊。寫過很多有意思的技術博客,也還在 ⌘ Read more
PolarisMesh 源碼系列 –Polaris-Go 註冊發現流程
導語北極星是騰訊開源的一款服務治理平臺,用來解決分佈式和微服務架構中的服務管理、流量管理、配置管理、故障容錯和可觀測性問題。在分佈式和微服務架構的治理領域,目前國內比較流行的還包括 Spring Cloud,Apache Dubbo 等。在 Kubernetes 的技術領域,也有以 Istio 爲代表的 ServiceMesh 技術。本篇 Blog 主要分析北極星的優勢,及其服務註冊發現的技術實現 ⌘ Read more
以 Go 語言爲例解釋什麼是僞共享以及如何解決
本文翻譯自:What’s false sharing and how to solve it (using Golang as example)譯文在解釋僞共享(false sharing)之前,有必要簡要介紹一下 CPU 架構中緩存是如何工作的。CPU 緩存中的最小單位是緩存行(cache line)(如今,CPU 中常見的緩存行大小爲 64 字節)。因此,當 CPU 從內存讀取一個變量時, ⌘ Read more
Golang 編寫範型集合,官方文檔未提及的訣竅
引言–Go 的泛型功能在 Go 1.18 版本中發佈, 至今已有兩年多了。我們正在使用 Go 開發 Dolt[1] , 這是世界上第一個支持版本控制的 SQL 數據庫。儘管我們有數十萬行 Go 代碼, 但我們並沒有大量使用泛型。我們在一些地方使用泛型 來加速代碼中的高流量部分 [2] , 但總的來說, 除了 slices[3] 和 maps[4] 包中的一些有用的庫方法外, 我們還沒有找到使用泛 ⌘ Read more
Go 語言的 CI-CD 實踐
CI/CD 是現代軟件開發流程中的關鍵實踐,它代表着持續集成(Continuous Integration)和持續部署(Continuous Deployment)或持續交付(Continuous Delivery)的組合。這些實踐旨在幫助軟件開發團隊更快、更頻繁地交付高質量的軟件產品。持續集成(CI): 持續集成是一種軟件開發實踐,開發團隊成員經常將他們的代碼變更集成到共享的代碼倉庫中。這通常每 ⌘ Read more
aconfig:Go 語言中簡潔高效的配置加載庫
在軟件開發過程中,合理處理配置項對於確保代碼的靈活性和可維護性至關重要。對於 Go 語言開發者們來說,aconfig庫提供了一個簡潔明瞭的解決方案來加載配置。本文將深入探討aconfig庫的特性和使用方法,向您展示如何高效地在 Go 項目中使用這個強大的配置加載工具。aconfig 的理念與特點————–aconfig是由開源社區提供的一個配置加載庫,它的設計理念基於實現配置加載 ⌘ Read more
使用 Go 提供的 Cookie 庫簡化 Cookie 操作
在 Web 開發中,Cookie 是一種非常常見的數據存儲形式。它可以幫助我們在客戶端和服務器之間保存一些狀態,如用戶的登錄狀態、偏好設置等。在 Go 語言中,操作 Cookie 有很多種方式,今天我們重點介紹一個名爲 cookie 的庫——這是一個可以使用結構體操作 Cookie 的庫。文章將詳細介紹 cookie 庫的使用方法、實際場景中的應用以及提供豐富的示例代碼。希望通過這篇文章,你能夠更 ⌘ Read more