# Twtxt is an open, distributed microblogging platform that # uses human-readable text files, common transport protocols, # and free software. # # Learn more about twtxt at https://github.com/buckket/twtxt # # This is an automated Yarn.social feed running feeds v0.1.0@72e53a9 # Learn more about Yarn.social at https://yarn.social # # nick = yue-fang-readfog-go # url = https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt # type = rss # source = https://www.readfog.com/t/go/feed # avatar = https://feeds.twtxt.net/yue-fang-readfog-go/avatar.png#vb4wqhdj5rsuracksspo5ewnd47jagkxwt5c4n4hh67ohxqtio5a # description = # updated_at = 2024-04-19T07:48:26Z # 2023-11-24T02:45:49Z **Go 語言項目命名規範(2023 年最新版)**
在 Go 語言中,良好的命名規範是構建清晰、可讀和可維護代碼的關鍵。本指南旨在幫助你制定一致的命名規範,使你的 Go 項目更加整潔和易於理解。在實際項目開發中,每個項目組的成員開發習慣不一樣,可能會有自己的一些規範,所以這個規範僅供參考。第一章:包命名規範在 Go 中,包是代碼組織的基本單元。包名應該簡短而具有描述性。使用小寫字母: 包名應該使用小寫字母,不要使用下劃線或混合大小寫。 ⌘ [Read more](https://www.readfog.com/a/1719421133697159168) 2023-11-24T10:29:30Z **Go 排序算法探祕:打造通用 qsort 函數**
\*概述快速排序(QuickSort)是一種經典的排序算法,其高效性和廣泛應用使之成爲計算機科學領域的瑰寶。本文將介紹如何在 Go 語言中封裝快速排序函數,使其更易用、更具通用性,並通過示例和代碼解釋,讓讀者深入瞭解其原理和實現。1. 快速排序算法簡介1.1 算法原理快速排序是一種分治策略的排序算法,基本思想是通過選定一個基準元素。將序列分爲兩部分,小於基準的元素放在左邊,大於基準的元素放在右邊,然 ⌘ [Read more](https://www.readfog.com/a/1719450305669730304) 2023-11-24T10:58:16Z **從 Discord 的做法中學習 — 使用 Golang 進行請求合併**
正如你可能之前看到的,Discord 去年發佈了一篇有價值的文章,討論了他們成功存儲了數萬億條消息。雖然有很多關於這篇文章的 YouTube 視頻和文章,但我認爲這篇文章中一個名爲 “數據服務爲數據服務” 的部分沒有得到足夠的關注。在這篇文章中,我們將討論 Discord 對數據服務的方法,並探討如何利用 Golang 的併發特性來減少特定情況下的數據庫負載。數據服務拯救熱分區如你所知,消息和頻道 ⌘ [Read more](https://www.readfog.com/a/1719452115536023552) 2023-11-27T03:57:03Z **Go 打造高效的聊天系統**
\*概述構建一個高效的 Go 語言聊天服務器是一個具有挑戰性而又令人興奮的任務。本文將通過示例代碼和註釋,逐步實現一個功能強大的 Go 語言聊天服務器。通過清晰的項目結構和合理的邏輯劃分,將能夠理解服務器的設計和實現。1. 項目規劃與結構設計1.1 項目規劃在開始構建聊天服務器之前,需要進行項目規劃。明確通信協議、確定服務器功能和定義用戶管理方式是關鍵步驟。1.2 結構設計設計一個清晰的結構是確保項 ⌘ [Read more](https://www.readfog.com/a/1719697406143074304) 2023-11-27T03:56:13Z **Go 語言 CSP 編程實戰:通道通信技術**
\*概述通信順序進程(Communicating Sequential Processes,CSP)是一種併發編程的形式化理論,由計算機科學家 Tony Hoare 於 1978 年提出。在 Go 語言中,CSP 被廣泛應用,通過通道(Channel)實現了簡單且強大的併發模型。本文將介紹 Go 語言中的 CSP 概念,通過詳細的示例代碼和註釋,理解 CSP 的運作原理和在 Go 中的實現。1. C ⌘ [Read more](https://www.readfog.com/a/1719697353332592640) 2023-11-27T03:59:12Z **Go 語言讀取 YAML 配置文件教程**
在 Go 語言項目中,處理配置文件是一項常見的任務。YAML 是一種易讀易寫的配置文件格式,本教程將指導你如何在 Go 中讀取和解析 YAML 文件。我們將按照章節的形式逐步介紹相關的概念和示例代碼。第一章:引入依賴--------在開始之前,我們需要引入一個 YAML 解析的第三方庫。推薦使用 gopkg.in/yaml.v2。go get gopkg.in/yaml.v2第二章:創建 YAML ⌘ [Read more](https://www.readfog.com/a/1719697540585197568) 2023-11-28T02:45:49Z **Go: select 實戰指南:協程切換技術**
概述Go 語言的併發編程模型以其簡潔而強大的 goroutine 爲特色。而 select 語句則是在多個通信操作中選擇一個執行的關鍵工具。本文將討論如何使用 select 切換協程,通過清晰的示例代碼,幫助讀者掌握這一重要的併發編程技巧。select 語句的基本結構package mainimport ( "fmt" "time")func main() { ch1 := make(chan s ⌘ [Read more](https://www.readfog.com/a/1719783521058394112) 2023-11-28T10:45:35Z **一文搞懂 Go gRPC 服務 Handler 單元測試**
在雲原生時代和微服務架構背景下,HTTP 和 RPC 協議成爲服務間通信和與客戶端交互的兩種主要方式。對於 Go 語言而言,標準庫提供了 net/http/httptest 包,爲開發人員提供了便捷的方式來構建服務端 HTTP Handler 單元測試的測試腳手架代碼,而無需真正建立 HTTP 服務器,讓開發人員可以聚焦於對 Handler 業務邏輯的測試。比如下面這個示例:// grpc-tes ⌘ [Read more](https://www.readfog.com/a/1719813705593622528) 2023-11-28T10:49:40Z **Go 淺析主流日誌庫:從設計層學習如何集成日誌輪轉與切割功能**
前言在現有的日誌庫中,包括 go 1.21.0 引入的 slog 日誌庫,它們通常都支持對日誌文件進行輪轉與切割,只不過這些功能並不直接被內置,而是需要我們主動配置來啓用。本文將探討幾個熱門的日誌庫如 logrus、zap 和官網的 slog,我將分析這些庫的的關鍵設計元素,探討它們是如何支持日誌輪轉與切割功能的配置。 淺析 logrus、zap 和 slog 的設計在對 logrus、zap 和 ⌘ [Read more](https://www.readfog.com/a/1719813962021834752) 2023-11-29T03:04:52Z **一篇文章帶你瞭解 Go 語言基礎之併發(channel)**
前言--Hi,大家好,我是碼農,星期八,本篇繼續帶來 Go 語言併發基礎,channel 如何使用。看看 Go 協程如何配合 channel。快來上車叭。爲什麼需要 channel-------------channel 在 Go 中,也叫做管道,是用來多線程之間共享數據的。通常情況下,在 Go 中共享數據用的也是channel,但是在 Go 有兩種共享數據方式。共享內存實現通訊。 通過管道 ⌘ [Read more](https://www.readfog.com/a/1719875316900532224) 2023-12-01T04:06:50Z **Go 語言中的反射機制**
在 Go 語言的衆多高級特性中,反射(Reflection)是一個強大且複雜的概念。它使得程序能夠在運行時檢查、修改其自身結構。反射在處理接口和類型斷言、開發通用功能或者設計框架時尤爲重要。本文將深入探索 Go 語言中的反射機制,通過具體的示例展示如何使用 reflect 包,讓你能夠在 Go 項目中有效地利用這一強大的工具。Go 反射基礎-------反射的概念反射是指計算機程序在運行時(run ⌘ [Read more](https://www.readfog.com/a/1720060409520689152) 2023-12-01T04:05:25Z **使用 Go 語言創建自己的密碼加密工具**
Go 語言藉助它的簡單性和強大的標準庫,實現一個自己的密碼加密工具非常簡單。在本篇文章中,我們將會結合代碼示例深入探討如何使用 Go 語言的 crypto 包來實現自己的加密工具。首先,我們需要 import 必要的包:package mainimport (    "crypto/aes"    "crypto/cipher"    "crypto/rand"    "fmt"    "io") ⌘ [Read more](https://www.readfog.com/a/1720060320200888320) 2023-12-01T04:17:00Z **Gin 如何實現跨域**
什麼叫做跨域    "跨域" 是一個網絡安全的概念,起源於瀏覽器的同源策略。同源策略是一種約定,它是由網景(Netscape)公司提出的一個重要的安全策略。所謂同源是指 "協議 + 域名 + 端口號" 三者相同,只要不同時,就算是不同源。    換句話說,"跨域" 指的是從一個域名的網頁去請求另一個域名的資源。例如,"http://website1.com" 的網頁通過 Ajax 獲取 "http ⌘ [Read more](https://www.readfog.com/a/1720061049039851520) 2023-12-01T04:16:15Z **TCP 基礎詳解:Telnet 迴音服務器搭建**
\*概述Telnet 迴音服務器是一個簡單而實用的網絡應用,通過 Telnet 協議連接,用戶輸入什麼,服務器就回顯什麼。本文將介紹如何使用 Go 語言創建一個 Telnet 迴音服務器,通過完整的示例代碼和詳細註釋,便於理解 TCP 服務器的基本結構和實現。1. TCP 服務器基礎TCP 協議簡介package mainimport ("fmt""net")func main() { liste ⌘ [Read more](https://www.readfog.com/a/1720061001655750656) 2023-12-01T04:14:45Z **無縫集成 GORM 與 Go Web 框架**
探索 GORM 與流行的 Go Web 框架之間的和諧集成,以實現高效的數據管理----------------------------------------高效的數據管理是每個成功的 Web 應用程序的基礎。GORM,多才多藝的 Go 對象關係映射庫,與流行的 Go Web 框架非常搭配,提供了無縫集成,簡化了數據交互。本指南將帶您探索 GORM 與諸如 Gin、Echo 和 Beego 等 ⌘ [Read more](https://www.readfog.com/a/1720060906688319488) 2023-12-01T04:21:33Z **Go 工具鏈詳解之升級版本不用愁的 go tool fix**
go tool fix 作用go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正爲新版本的代碼(這裏所說的版本是 Golang 的版本)。升級 Go 版本之後,使用這個命令可以自動對程序進行必要的更改。Golang 的演進過程中,對一些函數和標準庫進行改進是難免的,改進過程中有可能會出現兼容問題,一旦出現了兼容問題,從舊版本升級到新版本的代價 ⌘ [Read more](https://www.readfog.com/a/1720061335086141440) 2023-12-01T04:21:09Z **Gorm 中的遷移指南**
在應用程序開發的不斷變化的景觀中,數據庫模式更改是不可避免的。GORM,強大的 Go 對象關係映射庫,通過遷移提供了一種無縫的解決方案來管理這些變化。本文將作爲您全面的指南,幫助您掌握使用 GORM 進行數據庫遷移和模式管理。我們將深入探討自動遷移、創建和應用遷移,以及在您的 Go 項目中優雅處理不斷髮展的模式需求的策略。GORM 中的自動遷移-----------自動遷移是一個重要的改進,確保您 ⌘ [Read more](https://www.readfog.com/a/1720061309914025984) 2023-12-01T04:21:08Z **go-mongox:簡單高效,讓文檔操作和 bson 數據構造更流暢**
大家好,我是 陳明勇,一個熱愛技術,喜歡鑽研技術的程序員。前言在 Go 語言中使用 MongoDB 官方框架進行集合操作時,深深感到構建 bson 數據是一件非常繁瑣的工作。字段、逗號,括號等符號的排列,讓我感覺彷彿是在進行一場拼圖遊戲。因此我在想,有沒有一個能讓我絲滑,高效操作 MongoDB 的第三方框架呢,遺憾的是,並沒有找到符合我預期的框架,索性我就自己動手開發了一個,這就是 go-mon ⌘ [Read more](https://www.readfog.com/a/1720061309189459968) 2023-12-01T04:18:17Z **Go 反射終極指南:從基礎到高級全方位解析**
在本文中,我們將全面深入地探討 Go 語言的反射機制。從反射的基礎概念、爲什麼需要反射,到如何在 Go 中實現反射,以及在高級編程場景如泛型編程和插件架構中的應用,本文爲您提供一站式的學習指南。一、簡介反射是一種讓程序在運行時自省(introspect)和修改自身結構和行爲的機制。雖然這聽起來有點像 “自我觀察”,但實際上,反射在許多現代編程語言中都是一個非常強大和重要的工具。Go 語言也不例 ⌘ [Read more](https://www.readfog.com/a/1720061129904984064) 2023-12-01T04:17:28Z **17 個開源的 Go 語言博客和 CMS 解決方案**
Go 語言,也稱爲 Golang,是一種爲構建高效、可靠和可擴展軟件而設計的開源編程語言。它於 2007 年在 Google 開發,現在廣泛用於開發 Web 應用程序、網絡工具和系統軟件。爲什麼使用基於 Go 的 CMS 解決方案?----------------------這些優勢使 Go 成爲開發可擴展、高性能應用程序的熱門選擇。在使用 Go 構建基於 Web 的解決方案時,其速度是其中一個主 ⌘ [Read more](https://www.readfog.com/a/1720061078237450240) 2023-12-04T03:41:22Z **Go 反射之 reflect-TypeOf-- 和 reflect-Type**
\*概述在 Go 語言中,反射是一項強大的特性,它允許程序在運行時動態獲取變量的類型信息,進行類型操作與轉換,甚至能夠對結構體和函數進行反射操作。本文將探討 reflect.TypeOf() 和 reflect.Type,揭示 Go 語言 中反射的奧祕。一、reflect.TypeOf() 函數返回反射 Type 對象reflect.TypeOf() 函數用於獲取一個變量的反射 Type 對象。它接 ⌘ [Read more](https://www.readfog.com/a/1720330597969268736) 2023-12-04T07:16:57Z **2023 年 Go 併發庫的變化**
2023 年來, Go 的併發庫又有了一些變化,這篇文章是對這些變化的綜述。小細節的變化,比如 typo、文檔變化等無關大局的變化就不介紹了。sync.Once---------Go 1.21.0 中增加了和 Once 相關的三個函數,便於 Once 的使用。func OnceFunc(f func()) func()func OnceValueT any T) func() Tfunc Once ⌘ [Read more](https://www.readfog.com/a/1720344161571409920) 2023-12-04T07:40:41Z **慢聊 Golang 的 websocket 使用和實現代碼分析**
前言在[【你不知道的 websocket 協議,這次給你講明白!】](https://mp.weixin.qq.com/s?\_biz=MzkxNjIyMDY4OQ==&mid=2247484242&idx=1&sn=ab1c7e2abe8aec98c92b19b215378f02&chksm=c1527d2cf625f43a634a116cf6856dc17d5956297452ce034f55c ⌘ [Read more](https://www.readfog.com/a/1720345653986562048) 2023-12-05T09:31:02Z **Go 反射深度揭祕之 reflect-Elem-- 方法解析**
\*概述Go 語言中的反射機制提供了強大的工具,能夠在運行時獲取和操作變量的信息。其中,reflect.Elem() 方法是一個重要的利器,通過它能夠獲取指針指向的元素類型,提供更多的靈活性。本文將解析 reflect.Elem() 的方法簽名、作用機制,並通過豐富的示例演示其調用方式。一、Elem() 方法解析方法簽名func (v Value) Elem() ValueElem() 方法是 re ⌘ [Read more](https://www.readfog.com/a/1720443193988845568) 2023-12-05T09:38:04Z **介紹 Agency: 使 AI 與 Go 語言無縫對接**
在當今應用開發領域,類似 OpenAI API 等生成式 AI 技術的蓬勃發展正在徹底改變着應用開發的格局。Python 和 JavaScript 等語言已經擁有豐富的資源來支持這些技術,其中 LangChain 就是一個顯著的例子。然而,Go 語言開發者面臨的選擇卻相對有限。LangChainGo,作爲 LangChain 的 Go 語言版本,一直在努力與 Go 的編程理念保持一致,而 Lang ⌘ [Read more](https://www.readfog.com/a/1720443636221579264) 2023-12-06T03:31:31Z **Go 反射機制揭祕:輕鬆獲取結構體成員類型**
\*概述Go 語言的反射機制提供了強大的工具,使得在運行時獲取結構體的成員類型成爲可能。本文將介紹如何用反射實現結構體成員類型的獲取,包括結構字段的遍歷、按名稱訪問結構成員、處理匿名字段及內嵌類型,以及解析字段標籤元信息的方法。一、結構字段遍歷值對象及類型對象package mainimport ( "fmt" "reflect")type User struct { ID int Na ⌘ [Read more](https://www.readfog.com/a/1720511172200992768) 2023-12-06T03:39:44Z **conc 使用指南**
conc 使用指南conc 是由 sourcegraph 開源的一套友好的結構化併發工具包,其中總結了 sourcegraph 內部在編寫併發代碼時反覆遇到的問題的解決方案。conc.WaitGroup--------------conc 庫中的WaitGroup是作用域併發的主要構建塊。調用其Go方法能夠生成 goroutine,調用其Wait方法可以確保在生成的 goroutine 都退出後再 ⌘ [Read more](https://www.readfog.com/a/1720511688614187008) 2023-12-06T03:41:15Z **Go 項目的簡單部署**
概述--在上一篇筆記記錄了 Gin 實現簡單的註冊登錄和狀態管理。這一篇筆記來分享一下如何將上面的項目打包鏡像和部署,筆記分成三部分,分別是 Web 後端項目 Docker 鏡像的構建、使用 Docker 運行、使用 Docker Compose 和 k8s 部署容器。使用 Ingress 路由規則和 Web 前端的部署運行在下一篇筆記中記錄。構建 Docker 鏡像------------概述構 ⌘ [Read more](https://www.readfog.com/a/1720511784775946240) 2023-12-07T03:15:48Z **Go 的事件驅動編程:使用 EventBus 實現**
大家好!我是 [lincyang]。今天我們要探討的是 Go 語言中的事件驅動編程,特別是如何使用 EventBus 來實現這一目標。什麼是事件驅動編程?----------事件驅動編程是一種編程範式,其中應用程序的流程由外部事件(如用戶輸入或系統觸發的事件)來控制。這種方法在 GUI 應用、網絡編程和實時系統中尤爲常見。爲什麼選擇 EventBus?---------------EventBus ⌘ [Read more](https://www.readfog.com/a/1720600779919822848) 2023-12-07T03:24:07Z **老外總結的 14 條 Go 接口最佳實踐,有些不一樣**
最近幾個月,沒事喜歡看看老外寫的技術文章,發現他們的一些思考維度真的有些不太一樣。當然,他們寫的文章大多數沒有國內的那麼卷。今天這篇文章是關於 Go 語言中接口設計的一些最佳實踐,與 Java 等語言不盡相似,但又帶着 Go 語言的特色,可以對照學習,拓展編程思想層面的認知面。以下是在 Go 中使用接口的一些最佳實踐:1、優先小接口:接口是 Go 中的強大工具,但要保持它們小巧並專注於特定任務。這 ⌘ [Read more](https://www.readfog.com/a/1720601303105769472) 2023-12-07T03:22:51Z **Go 標籤實踐手冊,結構體標籤應用全攻略**
\*概述結構體標籤,作爲 Go 語言中獨有的元信息機制,提供了在運行時對結構體字段進行註釋和標記的能力。本文將介紹 Go 語言中結構體標籤的概念、自定義創建和處理、應用場景、標籤信息查詢以及代碼生成場景應用,帶讀者深入瞭解結構體標籤的細節和最佳實踐。一、結構體標籤概念標籤定義和格式解析package mainimport ( "fmt" "reflect")// 定義一個包含標籤的結構體type ⌘ [Read more](https://www.readfog.com/a/1720601223214764032) 2023-12-07T03:27:23Z **Go 的分佈式應用:使用 Raft 算法**
大家好!我是 [lincyang]。今天我們要探討的是如何在 Go 語言中使用 Raft 算法來構建分佈式應用。什麼是 Raft 算法?------------Raft 算法是一種用於管理分佈式系統中的複製日誌的一致性算法。它的主要目標是簡化分佈式系統的構建和理解。爲什麼使用 Raft?-----------Raft 算法相對於其他分佈式一致性算法(如 Paxos)來說,更易於理解和實現,同時也具 ⌘ [Read more](https://www.readfog.com/a/1720601508907683840) 2023-12-08T07:16:50Z **Go 深度解析 ValueOf-- 與 Value 的神奇魔法**
\*概述Go 語言中,反射機制提供了強大的工具,其中的 reflect 包中的 ValueOf() 和 Value 函數是反射的基礎。本文將介紹這兩個函數的作用機制,探討其在接口值轉換、參數傳遞規律等方面的實際運用。一、ValueOf 函數作用機制package mainimport ( "fmt" "reflect")func main() { // 使用 ValueOf 獲取接口值的反射對 ⌘ [Read more](https://www.readfog.com/a/1720706541196251136) 2023-12-08T07:13:41Z **Go 語言控制協程 -goroutine- 的併發數量,有哪些好的解決方法**
在使用協程併發處理某些任務時, 其併發數量往往因爲各種因素的限制不能無限的增大. 例如網絡請求、數據庫查詢等等。從運行效率角度考慮,在相關服務可以負載的前提下(限制最大併發數),儘可能高的併發。在 Go 語言中,可以使用一些方法來控制協程(goroutine)的併發數量,以防止併發過多導致資源耗盡或性能下降。以下是一些常見的方法:1. 使用信號量(Semaphore):可以使用 Go 語言中的 c ⌘ [Read more](https://www.readfog.com/a/1720706343218810880) 2023-12-11T02:58:15Z **Templ - 一種更好的管理 HTML 模板的 Go 語言框架**
背景介紹在開發 Web 應用時我們常常需要寫 HTML 代碼以構建用戶界面。然而,創建和管理 HTML 模板可能會變得非常複雜和困難,特別是在大型項目中。要優化並整理這些模板代碼,我們需要一個強大且易於使用的模板語言。這種需求在使用 Go 語言開發 Web 應用時尤爲突出,因爲 Go 語言在內建支持的模板語言方面還不夠友好,尚有待提升。今天要給大家推薦一個 GitHub 開源項目 a-h/temp ⌘ [Read more](https://www.readfog.com/a/1720962064140308480) 2023-12-11T02:55:26Z **Go 反射修改變量值全攻略**
\*概述Go 語言的反射機制爲提供了一種強大的方式來檢查和修改變量的值。本文將介紹如何通過反射修改變量的值,包括基本類型、結構體、切片等各種場景。一、反射對象獲取變量的反射對象package mainimport ( "fmt" "reflect")func main() { // 定義一個整數變量 num := 42 // 使用reflect.ValueOf獲取反射對象 value : ⌘ [Read more](https://www.readfog.com/a/1720961887141728256) 2023-12-12T03:59:22Z **Go 反射掌握指南:函數調用篇**
\*概述Go 語言的反射機制賦予了動態調用函數的能力。本文將介紹如何通過反射調用函數,以及基本函數、帶參函數、帶返回值函數等多種場景。一、獲取函數的反射對象獲取函數的反射對象package mainimport ( "fmt" "reflect")// 定義一個示例函數func ExampleFunction(name string, age int) { fmt.Printf("Hello, ⌘ [Read more](https://www.readfog.com/a/1721056505968562176) 2023-12-12T04:08:55Z **Go IsNil-- 和 IsValid-- 的精妙運用**
\*概述在 Go 語言中,反射是一項強大的特性,而 IsNil() 和 IsValid() 函數則是 reflect 包中兩個重要的函數,用於處理接口、通道、函數等各種類型。本文將深入介紹這兩個函數,解釋它們的用途、實際應用場景,並通過通俗易懂的例子更好地理解這兩個函數的神奇之處。一、IsNil() 函數判斷指針和接口是否爲 nilpackage mainimport ( "fmt" "refl ⌘ [Read more](https://www.readfog.com/a/1721057107288100864) 2023-12-12T04:05:37Z **go-elasticsearch 使用指南**
本文是 go-elasticsearch 庫的使用指南。go-elasticsearch 是 Elasticsearch 官方提供的 Go 客戶端。每個 Elasticsearch 版本會有一個對應的 go-elasticsearch 版本。官方會維護最近的兩個主要版本。go-elasticsearch 提供了 Low-level 和 Fully-typed 兩套 API。本文以 Fully-ty ⌘ [Read more](https://www.readfog.com/a/1721056898742063104) 2023-12-13T03:05:43Z **Go map 讀寫性能優化 - 分片 map**
基本在所有的編程語言中,都有 map 這種數據結構,Go 語言也不例外。我們知道 Go 是一門對併發支持得比較好的語言,但是 map 並不支持併發讀寫。比如,下面這種寫法是錯誤的:var m = make(map[int]int)var wg sync.WaitGroupwg.Add(2)// 啓動兩個協程序同時寫入 mapgo func() {    for i := 0; i < 100; i ⌘ [Read more](https://www.readfog.com/a/1721143727537360896) 2023-12-18T03:06:21Z **Go 語言爲什麼很少使用數組?**
01 介紹在 Go 語言中,數組是一塊連續的內存,數組不可以擴容,數組在作爲參數傳遞時,屬於值傳遞。數組的長度和類型共同決定數組的類型,不同類型的數組之間不可以比較,否則在編譯時會報錯。因爲數組的一些特性,我們在 Go 項目開發中,很少使用數組。本文我們介紹一下數組的特性。02 數組聲明方式在 Go 語言中,數組的聲明方式有三種。示例代碼:func main() { var arr1 [2]int ⌘ [Read more](https://www.readfog.com/a/1721596752480538624) 2023-12-18T03:05:19Z **Go JSON 文件讀寫最佳實踐**
\*概述在 Go 語言中,JSON(JavaScript Object Notation)是一種常見的數據交換格式,用於在不同語言之間進行數據傳遞。本文將介紹 Go 語言中如何進行 JSON 文件的讀寫操作,包括解析與序列化,錯誤處理,以及一些實用技巧。一、JSON 文件基礎操作JSON 文件的讀取如何從 JSON 文件中讀取數據。package mainimport ( "encoding/js ⌘ [Read more](https://www.readfog.com/a/1721596687056736256) 2023-12-18T03:04:26Z **每個 Go 程序員必犯之錯**
說起每個程序員必犯的錯誤,那還得是 "循環變量" 這個錯誤了,就連 Go 的開發者都犯過這個錯誤,這個錯誤在 Go 的 FAQ 中也有提到 What happens with closures running as goroutines?[1]:func main() {    var wg sync.WaitGroup    values := []string{"a", "b", "c"} ⌘ [Read more](https://www.readfog.com/a/1721596631997059072) 2023-12-19T08:42:10Z **使用 gorm-Scopes 函數複用查詢邏輯**
今天要學習的是gorm.Scopes函數的使用。該函數的作用就是複用查詢條件。gorm Scopes 是什麼---------------在項目中,你一定會遇到過很多需要複用的查詢條件。比如常用的場景有分頁、查詢時判定數據權限等操作。比如,我們有兩個數據資源:用戶列表和部門列表。那麼,在查詢列表的時候都會涉及到分頁。當然可以在每個列表中都增加上列表相關的查詢。同時,也可以將分頁的查詢抽取出來,做成 ⌘ [Read more](https://www.readfog.com/a/1721708476441399296) 2023-12-19T08:43:56Z **Go: XML 文件的讀寫操作詳解**
\*概述XML(可擴展標記語言)作爲一種常見的數據交換格式,廣泛應用於配置文件、數據傳輸等場景。本文將介紹如何在 Go 語言 中進行 XML 文件的讀寫操作,涵蓋 XML 基礎知識、編碼 / 解碼基礎、讀取 XML 文件、寫入 XML 文件、實戰操作示例以及 XML 與 JSON 對比選型。一、XML 基礎知識簡介XML 語法結構XML 採用標籤(tag)來標記數據,具有自我描述性。一個基本的 XM ⌘ [Read more](https://www.readfog.com/a/1721708588560388096) 2023-12-20T10:31:17Z **Gob 實踐全攻略,數據傳輸利器**
\*1\. Gob 簡介1.1 Gob 概述Gob(Go binary)是 Go 語言中用於序列化和反序列化數據的編碼庫。它是 Go 語言的標準庫之一,專門設計用於在 Go 程序之間高效地傳輸數據。Gob 可以將複雜的數據結構編碼成二進制格式,便於在不同系統之間傳遞,並支持版本控制和演進。1.2 爲什麼選擇 GobGob 相比其他序列化格式(如 JSON、XML)具有更高的性能和更小的數據體積。它是專 ⌘ [Read more](https://www.readfog.com/a/1721805938774609920) 2023-12-20T10:51:54Z **使用 Go 構建高性能的事件管理器**
事件驅動編程是一種編程範式,在這種範式下,程序的執行流由外部事件(如用戶操作、傳感器輸出或消息傳遞)來決定。在 Go 語言中,構建一個事件管理器可以幫助我們更好地組織和處理這些事件。本文將詳細探討如何在 Go 語言中創建和使用事件管理器,包括事件的定義、監聽和觸發,提供豐富的示例來指導你構建自己的事件驅動應用。Golang 事件管理器概述--------------事件驅動編程的優勢解耦:減少組件 ⌘ [Read more](https://www.readfog.com/a/1721807236424110080) 2023-12-21T06:48:39Z **將 go 代碼打包成 docker 鏡像**
概述--在本教程中,你將生成一個容器映像。該映像包括運行應用程序所需的一切:編譯的應用程序二進制文件、運行時、庫以及應用程序所需的所有其他資源。前置條件----若要完成本教程,需要滿足以下條件:golang 1.19+ 本地安裝了 docker Git 客戶端 程序--該應用程序提供兩個 HTTP endpoint:/ 返回符號 < 3 /health 返回 {"Statu ⌘ [Read more](https://www.readfog.com/a/1721882528641552384) 2023-12-21T06:47:17Z **grpc-go 從使用到實現原理全解析!**
前言--本期將從 rpc 背景知識開始瞭解,如何安裝進行開發前的環境準備,protobuf 文件格式瞭解,客戶端服務端案例分享等,逐漸深入瞭解如何使用 grpc-go 框架進行實踐開發。背景知識瞭解------rpcrpc(Remote Procedure Call)遠程過程調用協議,採用的是客戶端 / 服務端模式,常用於微服務架構,通過網絡從遠程計算機上請求服務,而不需要了解底層網絡技術的協議, ⌘ [Read more](https://www.readfog.com/a/1721882442588065792) 2023-12-22T03:22:50Z **在 golang 中如何實現 WebSocket 的雙向通信**
在 Go 語言中實現 WebSocket 的雙向通信通常需要使用第三方庫,其中 gorilla/websocket 是一個非常流行和廣泛使用的庫。以下是實現 WebSocket 雙向通信的步驟和簡單示例代碼:1 安裝 gorilla/websocket 庫:go get github.com/gorilla/websocket2 編寫 WebSocket 服務器:package mainimpor ⌘ [Read more](https://www.readfog.com/a/1721960177536700416) 2023-12-22T08:08:19Z **Go 處理二進制文件這麼簡單**
\*1\. 概述1.1 爲什麼學習二進制文件讀寫Go 語言內置了豐富的文件操作函數,可以很方便地處理文本文件。但對於音視頻、圖像等二進制文件,文本文件函數就不太適用了。學習 Go 語言的二進制文件讀寫操作,可以更高效地處理這些非文本文件,在實際項目中也很常用。1.2 Go 語言處理二進制文件的優勢Go 語言處理二進制文件具有以下優勢 1. 性能高,讀寫速度快 2. 支持跨平臺,代碼可以在多 ⌘ [Read more](https://www.readfog.com/a/1721978138480709632) 2023-12-25T04:21:45Z **手把手教你寫個自己的 protoc-gen-go**
你是否用過 protobuf 或 gRPC? 你們公司項目的 API 有沒有用到 proto 文件? 本文將帶你一步一步寫個類似protoc-gen-go-grpc的 proto 文件生成工具,從 proto 文件生成兼容 Go 標準庫的 HTTP 框架代碼。掌握它之後,你就能隨心所欲的從 proto 文件生成gin、echo、net/http代碼,甚至生成你自己的框架代碼。 別擔心 ⌘ [Read more](https://www.readfog.com/a/1722235674917179392) 2023-12-25T04:20:36Z **從 Go channel 中批量讀取數據**
有時候批量積攢一批數據集中處理,是一個高效的提高程序性能的方法,比如我們可以批量寫入數據庫,批量發送消息到 kafka,批量寫入網絡數據等等。 批量把數據收集出來,我們常用 channel 類型,此時 channel 的功能就是一個 buffer, 多個生產者把數據寫入到 channel 中,消費者從 channel 中讀取數據,但是 Go 的 channel 並沒有提供批量讀取的方法,我們需要自 ⌘ [Read more](https://www.readfog.com/a/1722235602268688384) 2023-12-25T04:19:48Z **Go 語言實現高性能分佈式鎖**
在分佈式系統中,實現跨不同服務或節點的同步操作是一個常見的挑戰。分佈式鎖提供了一種有效的機制來確保在分佈式環境中只有一個進程或線程能執行特定的操作。本文將探討在 Go 語言環境中實現分佈式鎖的原理和方法,包括使用 Redis 和 Etcd 作爲鎖的存儲後端,並提供實際的代碼示例。分佈式鎖的基本概念---------定義和用途分佈式鎖用於在不同的進程或系統間同步訪問共享資源。 它特別適用於分佈 ⌘ [Read more](https://www.readfog.com/a/1722235552384782336) 2023-12-25T10:04:28Z **基於 FX 構建大型 Golang 應用**
Uber 開源的 FX 可以幫助 Go 應用解耦依賴,實現更好的代碼複用。原文: How to build large Golang applications using FX[1] 構建複雜的 Go 應用程序可能會引入很多耦合Golang 是一種流行編程語言,功能強大,但人們還是會發現在處理依賴關係的同時組織大型代碼庫很複雜。Go 開發人員有時必須將依賴項的引用傳遞給其他人,從而造成重用代碼 ⌘ [Read more](https://www.readfog.com/a/1722257236299976704) 2023-12-25T10:11:38Z **tar 歸檔文件處理操作指南**
\*1\. tar 文件的概述打包和壓縮多個文件在文件處理中,經常需要將多個文件打包成一個歸檔文件以便傳輸或存儲。tar 文件就是一種常見的歸檔文件格式,它能夠將多個文件和文件夾組織成一個單一的文件。結構簡單,跨平臺特性好Tar 文件採用簡單的文件組織結構,這種結構使得 tar 文件在不同操作系統之間具有很好的兼容性。Go 語言通過標準庫內置了對 tar 文件的支持,使得在 Go 中處理 tar 文件 ⌘ [Read more](https://www.readfog.com/a/1722257687544172544) 2023-12-25T10:10:05Z **深入淺出內存管理:空間分配及逃逸分析**
大家好,我是小❤,一個漂泊江湖多年的 985 非科班程序員,曾混跡於國企、互聯網大廠和創業公司的後臺開發攻城獅。引言-----內存管理,是開發者在程序編寫和調優的過程中不可繞開的話題,也是走向資深程序員必須要了解的計算機知識。有經驗的面試官會從內存管理的掌握程度去考察一個候選人的技術水平,這裏面涉及到的知識可能包括操作系統、計算機組成原理以及編程語言的底層實現等。說到內存,其實就是存儲器,我們可以 ⌘ [Read more](https://www.readfog.com/a/1722257589769703424) 2023-12-25T10:08:47Z **基於 Go-Kit 的 Golang 整潔架構實踐**
如何用 Golang 實現簡潔架構?本文介紹了基於 Go-Kit 實現簡潔架構的嘗試,通過示例介紹了簡潔架構的具體實現。原文: Why is Go-Kit Perfect For Clean Architecture in Golang?[1]簡介Go 是整潔架構 (Clean Architecture) 的完美選擇。整潔架構本身只是一種方法,並沒有告訴我們如何構建源代碼,在嘗試用新語言實現時 ⌘ [Read more](https://www.readfog.com/a/1722257508323659776) 2023-12-29T02:43:48Z **Go 配置文件大揭祕:INI 文件讀寫實戰詳解**
\*1\. INI 文件簡介INI(Initialization)文件是一種簡單、文本文件格式,常用於配置文件。它由多個節(section)組成,每個節包含多個鍵值對。鍵值對的格式爲 key=value,節的格式爲 [section]。簡單示例如下://  示例INI文件[database]host = localhostport = 3306username = userpassword = sec ⌘ [Read more](https://www.readfog.com/a/1722591900085620736) 2024-01-02T03:02:51Z **Go 語言中的 nil 不相等問題**
Go 語言作爲一門靜態類型的編程語言,提供了豐富的類型系統。在這個類型系統中,nil 扮演着空值的角色,類似於其他編程語言中的 null 或 None。然而,在 Go 中,對於 nil 的處理與其他語言有着本質的不同,這導致了一些獨特的行爲,尤其是在不同類型的 nil 比較時。什麼是 nil?--------在 Go 中,nil 是一個預聲明的標識符,它可以代表某些類型的零值。具體來說,下列類型的 ⌘ [Read more](https://www.readfog.com/a/1722955486867853312) 2024-01-02T03:01:19Z **go clean 命令 完全解析**
\*1\. go clean 命令介紹命令作用和使用場景在 Go 語言開發中,go clean 命令是一個強大的工具,用於清除與 Go 構建相關的文件和目錄。它通常在項目維護、優化和 CI/CD 任務中發揮重要作用。使用場景包括但不限於: 在提交代碼前,清理本地構建產物,確保提交的是源代碼而非編譯文件。 在項目重構或遷移時,清理舊有構建產物,避免與新的代碼混淆。 在 CI/CD 流程中, ⌘ [Read more](https://www.readfog.com/a/1722955389553709056) 2024-01-02T02:57:22Z **使用 Gotify 來搭建你的消息推送系統**
通過消息推送,我們可以實時的獲取有效的信息。比如結果,驗證碼以及一些重要的通知場景等。今天要分享的是 gotify,是一個用 go 編寫的消息服務端,也有客戶端,通過 gotify 我們可以簡單的進行收發消息。gotify 的 地址將會在文末展示。gotify 支持的功能如下可以通過 restapi 發送消息 可以通過 websocket 接收消息 可以管理用戶和客戶端以及應用程序 ⌘ [Read more](https://www.readfog.com/a/1722955141071605760) 2024-01-02T03:06:34Z **Go 測試的 20 個實用建議**
2023 年 11 月初,Go 語言技術負責人 Russ Cox 在 GopherCon Australia 2023[1] 大會上進行了題爲 “Go Testing By Example”[2] 的演講:12 月初 Russ Cox 重新錄製了該演講內容的視頻,並在個人網站 [3] 上放了出來。這個演講視頻是關於如何編寫好的 Go 測試的,Russ Cox 介紹了 20 個實用建議,非常值得 G ⌘ [Read more](https://www.readfog.com/a/1722955720264093696) 2024-01-04T02:54:28Z **go run 命令核心技術詳解**
\*1\. go run 命令簡介在 Go 語言開發中,go run 命令是一個非常常見且便捷的工具,它用於編譯並直接運行 Go 語言源代碼文件,而不需要生成可執行文件。本文將深入介紹 go run 的語法、常見用法實例、編譯命令行選項、注意事項,以及與 go build、go install 的區別和常見用途。2. go run 語法 go run 命令的基本語法爲:go run [文件名.go] ⌘ [Read more](https://www.readfog.com/a/1723136153118412800) 2024-01-04T03:06:37Z **golang 定時器相關的函數超硬核解析**
一、前言Golang 定時器包括:一次性定時器(Timer)和週期性定時器 (Ticker)。編程中經常會通過 timer 和 ticker、AfterFunc。定時器 NewTicker 是設定每隔多長時間觸發的,是連續觸發,而計時器 NewTimer 是等待多長時間觸發的,只觸發一次,兩者是不同的。等待時間函數 AfterFunc 是在 After 基礎上加了一個回調函數,是等待時間到來後在另 ⌘ [Read more](https://www.readfog.com/a/1723136917455867904) 2024-01-04T03:01:12Z **Build 實戰指南:優雅編譯,高效開發**
\*1\. Go Build 命令介紹1.1 基本語法格式Go 語言的 go build 命令用於編譯一個或多個 Go 源代碼文件,生成可執行文件或包。基本語法格式如下go build [標誌] [包名] 標誌:用於指定編譯時的選項和參數。 包名:可選,指定要編譯的包的路徑。如果省略包名,將編譯當前目錄下的所有 Go 源代碼文件。 go build 命令的工作原理包括以下步驟: 1. 分 ⌘ [Read more](https://www.readfog.com/a/1723136576182128640) 2024-01-05T04:03:58Z **Uber Go 出了個靜態分析工具 NilAway,還挺實用!**
大家好,我是煎魚。風水輪流轉,Go 程序寫多了。總是會這有點問題,那有點問題。問題積累久了就容易出點事件,甚至是事故。這種時候大家往往會想着引入一些靜態分析工具來解決這個問題。元旦假期時剛好看到這個新輪子,分享給大家!NilAway 分析工具------------最近 Uber 開發和開源了一個挺不錯的靜態分析工具 NilAway:使用場景是:在 Go 程序編譯時就能捕獲 nil,達到幫助開發人 ⌘ [Read more](https://www.readfog.com/a/1723231122070016000) 2024-01-05T04:03:22Z **Go 巧用 io-Pipe-- 優化內存佔用情況**
當需要向服務端通過 http api 上傳大文件時候,通常會使用以下這種方式func main(){ filename := "nohup.out" body := new(bytes.Buffer) writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("file", filename ⌘ [Read more](https://www.readfog.com/a/1723231085054234624) 2024-01-05T04:02:32Z **假如沒有 go install,編譯會多痛苦?**
\*1\. go install 命令簡介go install 命令是 Go 語言的標準命令, 用於編譯和安裝 Go 語言程序。1.1 命令作用及基本原理go install 命令的主要作用是編譯和安裝 Go 語言的可執行文件或庫文件。它的基本原理是: 1. 按照包依賴關係編譯傳遞進來的 main 包及其所有依賴的包 2. 鏈接必要的包生成可執行文件 3. 將生成的可執行文件拷貝到 ⌘ [Read more](https://www.readfog.com/a/1723231032364339200) 2024-01-05T11:08:05Z **使用 Golang Fiber 快速創建高性能的 Web 應用程序**
Golang Fiber 是一個靈感來源於 Express.js 的 Web 開發框架,它旨在簡化 Go 語言中的 HTTP 服務開發,同時提供極高的性能。它基於 Fasthttp,這是一個快速的 HTTP 引擎,專爲高性能而設計。在這篇文章中,我們會詳細介紹如何使用 Fiber 創建 web 應用程序,並提供豐富的示例。開始前的準備------在開始之前,確保你已安裝了 Go 語言環境。你可以在 ⌘ [Read more](https://www.readfog.com/a/1723257806085263360) 2024-01-08T03:04:22Z **掌握 go test 命令,寫出可信賴的代碼**
\*1\. test 命令概述在開發過程中,測試是確保代碼質量和穩定性的關鍵步驟。通過測試,可及早發現潛在的問題,確保代碼的正確性和可維護性。Go 語言提供了強大的測試工具,其中 go test 命令是一個不可或缺的利器。1.1 單元測試單元測試是驗證代碼中最小可測試單元的過程。在 Go 中,單元測試通常位於與被測試代碼相同的包中,以 test.go 結尾的文件中。go test 會執行這些文件中的測 ⌘ [Read more](https://www.readfog.com/a/1723499163725959168) 2024-01-08T03:09:36Z **一個例子,給你講透典型的 Go 併發控制**
Go 中可以使用一個go關鍵字讓程序異步執行一個比較常見的場景:逐個異步調用多個函數,或者循環中異步調用func main() { go do1() go do2() go do3()}// 或者func main() { for i := range []int{1,2,3}{  go do(i) }}如果瞭解 Go 併發機制,就知道main在其他 goroutine 運行完成之前就已經結束了, ⌘ [Read more](https://www.readfog.com/a/1723499492523741184) 2024-01-09T02:50:12Z **性能分析神器:pprof 命令詳解與實戰**
\*一、pprof 命令簡介pprof 的功能和作用Go 語言提供了一個強大的性能分析工具,即 pprof(profiling and tracing)。pprof 可以幫助開發者深入瞭解應用程序的性能狀況,從而更好地進行性能優化。其主要功能包括: CPU Profiling:定位 CPU 密集型任務,找到瓶頸; Memory Profiling:檢測內存使用情況,發現潛在的內存泄漏; ⌘ [Read more](https://www.readfog.com/a/1723588868941385728) 2024-01-09T03:35:30Z **Go 運行時的併發原語**
這篇文章我們來了解一下隱藏在 Go 運行時中的一些併發原語, 因爲運行時是底座和包循環依賴等原因,運行時中很少使用標準庫中的併發原語,它有自己的併發原語。mutex在 runtime/runtime2.go[1] 定義了一個互斥鎖,它的定義如下:type mutex struct { lockRankStruct key uintptr}它可是運行時中的大紅人了,在很多數據結構中都被廣泛的使用,凡 ⌘ [Read more](https://www.readfog.com/a/1723591719850708992) 2024-01-10T02:57:59Z **Go 調用 C-C-- 函數全攻略**
\*一、Go 語言調用 C/C++ 函數cgo 基礎及工作原理Go 語言通過 cgo 和 C 語言的 ABI(Application Binary Interface) 進行交互。cgo 會生成相應的 C 代碼, 與 Go 代碼一起編譯成可執行文件或動態庫。cgo 的工作流程主要分爲 3 步:(1) 預處理: 將 Go 源碼中的 C 代碼塊提取出來, 生成 .c 和 .h 文件(2) 編譯: 調用 ⌘ [Read more](https://www.readfog.com/a/1723679956468338688) 2024-01-11T03:18:50Z **Go 內存管理探祕:自動化與性能的完美平衡**
\*一、Go 語言內存管理簡介Go 語言自動內存管理機制Go 語言以其簡潔高效的特性而備受開發者推崇,其中自動內存管理是其引以爲傲的一項特性。與傳統的手動內存管理語言不同,Go 語言通過垃圾回收器(GC)自動管理內存,極大地減輕了開發者的負擔。Go 語言的垃圾回收器採用的是基於併發標記 - 清除算法,這意味着垃圾回收的過程中,程序的執行並不會完全停滯,從而保證了較低的暫停時間。內存分配與回收策略Go ⌘ [Read more](https://www.readfog.com/a/1723771865278812160) 2024-01-11T07:44:58Z **沒想到,Go 語言垃圾回收是這樣工作的!**
\*1\. 垃圾回收概述1.1 什麼是垃圾回收垃圾回收 (Garbage Collection,GC) 是一種自動內存管理的機制, 用於自動釋放那些不再被程序使用的內存。它的主要思想是程序在申請內存時不需要釋放, 而是由垃圾回收器在程序運行的過程中找出那些不再使用的內存並回收它們。這與 C/C++ 語言中的手動內存管理形成對比, C/C++ 程序員需要自己跟蹤內存的分配和釋放。而 Go 語言中內存的分 ⌘ [Read more](https://www.readfog.com/a/1723788608382537728) 2024-01-11T07:51:56Z **Go Context 到底放第一個參數傳,還是放結構體裏?**
大家好,我是煎魚。前段時間我們在聊手動管理內存 arena 的後續時。我們有提到 context 的函數傳參等問題。當時在評論區有許多的小夥伴交流了起來,大家對此還是非常關注的:今天我們就來聊一聊 conetxt 傳參的這個事。到底擺哪?Go 官方推薦是什麼?快速介紹----上下文(Context)是 Go 語言中非常有特色的一個特性,其主要的作用是在 goroutine 中進行上下文的傳遞,而在 ⌘ [Read more](https://www.readfog.com/a/1723789046415724544) 2024-01-12T02:21:13Z **Go 語言常見錯誤 - any 沒傳遞任何信息**
Go 語言,由於其高效強大的並行處理能力和優雅簡單的設計哲學,一直以來都是編程世界的寵兒。然而,對於一些 Go 新手和甚至熟悉 Go 的程序員也可能會遇到一個常見的錯誤: any沒傳遞任何信息。那麼,如何規避這個錯誤呢?本文將揭示其中的祕密。問題描述----首先,在 Go 中的接口類型interface{}(也被稱作 “any” 類型)是一種空接口類型,可以接受任何類型的參數,無論是用戶自定義的類 ⌘ [Read more](https://www.readfog.com/a/1723858837285474304) 2024-01-15T02:50:19Z **Go 語言常見錯誤 - 不使用 function option 模式**
在使用 Golang 進行復雜的開發任務時,處理一個結構體有許多可選的配置項是常有的事。這也是在許多函數設計中共有的特徵,因爲這使得函數更容易使用,靈活性更強。然而,有時我們可能會看到錯誤的實踐,那就是 “遺漏使用 Function Option 模式”。在這篇文章中,我將詳細解釋Function Option的概念,並指出爲什麼我們應該使用它。我還將給出實例來展示如果忽略了Function Op ⌘ [Read more](https://www.readfog.com/a/1724132458916581376) 2024-01-16T03:07:00Z **Go 1-18 泛型全面講解:一篇講清泛型的全部**
序2022 年 3 月 15 日,爭議非常大但同時也備受期待的泛型終於伴隨着 Go1.18 發佈了。可是因爲 Go 對泛型的支持時間跨度太大,有非常多的以 “泛型” 爲關鍵字的文章都是在介紹 Go1.18 之前的舊泛型提案或者設計,而很多設計最終在 Go1.18 中被廢棄或發生了更改。並且很多介紹 Go1.18 泛型的文章 (包括官方的) 都過於簡單,並沒對 Go 的泛型做完整的介紹,也沒讓大家意 ⌘ [Read more](https://www.readfog.com/a/1724224105368096768) 2024-01-16T02:57:32Z **Golang 實現程序優雅退出的方法有哪些?**
在 Go 語言中,實現程序的優雅退出是一項重要的任務,特別是在涉及到 HTTP 服務器、gRPC 服務器、以及其他後臺工作的情況下。以下是一些常見的平滑關閉方法:1. HTTP Server 平滑關閉Go 1.8 及以上版本提供了 http.Server 結構的 Shutdown 方法,用於平滑關閉 HTTP 服務器。package mainimport (    "context"    "ne ⌘ [Read more](https://www.readfog.com/a/1724223509248446464) 2024-01-17T03:58:46Z **Go 插件機制詳解:原理、設計與最佳實踐**
\*1\. Go 語言插件基礎1.1 插件概述插件是一種動態加載的代碼單元, 它可以在程序運行期間被動態加載和掛接到主程序上, 從而擴展主程序的功能。Go 語言從 1.8 版本開始, 通過 plugin 包提供了對插件的初步支持。利用插件, 可以在不需要重新編譯主程序的情況下, 動態地擴展主程序的功能, 做到高內聚低耦合。1.2 插件的定義和結構從實現上看, Go 語言的插件就是一個獨立編譯的 dyn ⌘ [Read more](https://www.readfog.com/a/1724317958697750528) 2024-01-17T04:05:11Z **Go 調用 C-- 動態庫實現車牌識別**
前言-----很久沒更新博客,這次正好趁着這次機會來更新一個稍微有點意思的內容,利用 C++ 中 Opencv、TensorRT 等庫編譯出動態庫供 Go 調用,再寫個簡單的 api 對上傳的車輛圖片進行車牌識別。究其原因,天下苦 Java 久矣,每次寫 JNI 去給公司 Java 後端服務調用,而我不喜歡 Java 那我每次寫好的模型動態庫就到此爲止了?白白浪費之前那麼多計算資源於心不忍,因此打 ⌘ [Read more](https://www.readfog.com/a/1724318362766512128) 2024-01-18T06:51:54Z **Go 語言與 gRPC 的完美結合**
\*一、gRPC 簡介gRPC(Remote Procedure Call) 是一種遠程過程調用技術, 通過壓縮和序列化數據來優化網絡通信, 可以顯著提高服務調用的性能和效率。gRPC 的概念gRPC 是一個高性能、通用的開源 RPC 框架, 是一個由 Google 主導開發的 RPC 框架。其以 HTTP/2 爲基礎通信協議, 支持多種語言, 通過 protocol buffers 數據格式來實現 ⌘ [Read more](https://www.readfog.com/a/1724419448329310208) 2024-01-18T06:57:53Z **基於 go 實現 lsm tree 之主幹框架**
0 導讀去年 4 月的時候,我和大家分享了一篇文章——初探 rocksDB 之 lsm tree,和大家一起探討了 lsm tree 結構的底層實現原理. 秉着 【基於源碼支撐原理】 的一貫原則,從本期開始,咱們把源碼篇的坑填上.接下來我將開啓一個新的專題——基於 go 語言從零到一實現 lsm tree,本專題共分爲下述四篇內容:• 基於 go 實現 lsm tree 之主幹框架(本篇) ⌘ [Read more](https://www.readfog.com/a/1724419824717762560) 2024-01-19T04:04:50Z **原來可以這麼使用 Protobuf**
\*1\. Protobuf 簡介1.1 Protobuf 是什麼Protocol Buffers (簡稱 Protobuf) 是 Google 公司開源的一種輕便高效的結構化數據存儲格式, 以及用於序列化和反序列化結構化數據的代碼生成器。它可以用於通訊協議和數據存儲等領域。Protobuf 是以 .proto 文件形式定義結構化數據的方式和格式。並且通過代碼生成器生成各平臺 (Java、C++、Py ⌘ [Read more](https://www.readfog.com/a/1724499535110180864) 2024-01-22T02:45:09Z **Go 語言實戰:構建強大的延遲任務隊列**
01 介紹延遲隊列是一種數據結構,用於處理需要在未來某個特定時間執行的任務。這些任務被添加到隊列中,並且指定了一個執行時間,只有到達指定的時間點時才能從隊列中取出並執行。在實際應用中,延遲隊列可以用於處理各種需要延遲處理的任務,例如發送郵件提醒、訂單自動取消、對超時任務的處理等。由於任務的執行是在未來的某個時間點,因此這些任務不會立即執行,而是存儲在隊列中,直到它的預定執行時間纔會被執行。02 S ⌘ [Read more](https://www.readfog.com/a/1724766311908741120) 2024-01-23T03:56:06Z **千萬級高性能長連接 Go 服務架構實踐**
作者 \| glstr導讀 introduction移動互聯網時代,長連接服務成爲了提升應用實時性和互動性的基礎服務。本文主要介紹了百度系內基於 golang 實現的統一長連接服務。主要從統一長連接功能實現和性能優化等角度,描述了統一長連接服務在設計、開發和維護過程中面臨的問題和挑戰,重點介紹瞭解決相關問題和挑戰的解決方案和實踐經驗。01摘要移動互聯網時代,用戶對服務的實時性、互動性有了更高的要求, ⌘ [Read more](https://www.readfog.com/a/1724861373274492928) 2024-01-23T03:53:02Z **golang 中如何使用 kafka**
Kafka 是一種備受歡迎的流處理平臺,具備分佈式、可擴展、高性能和可靠的特點。在處理 Kafka 數據時,有多種最佳實踐可用來確保高效和可靠的處理。本文將介紹這些實踐方法,並展示如何使用 Sarama 來實現它們。Kafka 消費的最佳實踐取決於你的使用場景和需求,以下是一些建議:1 使用 Consumer Group: 在生產環境中,建議使用 Consumer Group,這樣可以確保多個消費 ⌘ [Read more](https://www.readfog.com/a/1724861180071219200) 2024-01-24T03:04:23Z **Gofr - 簡化微服務開發的編程框架**
背景介紹在微服務開發過程中,我們常常遇到各類問題。例如,REST 默認的標準難以踐行、在企業級規模上的挑戰、數據庫狀態管理、錯誤管理等等。以往,我們需要手動進行配置、對各個部分進行維護和測試。但隨着 Gofr 的出現,這一切都可以得到解決。今天要給大家推薦一個 GitHub 開源項目 gofr-dev/gofr,該項目在 GitHub 有差不多 1000 Star,用一句話介紹該項目就是:“An ⌘ [Read more](https://www.readfog.com/a/1724948715981082624) 2024-01-24T03:40:03Z **Go 定時器:Timer 和 Ticker**
前言在日常開發中,我們可能會遇到需要延遲執行或週期性地執行一些任務。這個時候就需要用到 Go 語言中的定時器。在 Go 語言中,定時器類型有兩種:time.Timer 一次性定時器和 time.Ticker 週期性定時器。本文將會對這兩種定時器類型進行介紹。準備好了嗎?準備一杯你最喜歡的咖啡或茶,隨着本文一探究竟吧。Timer:一次性定時器Timer 是一個一次性的定時器,用於在未來的某一時刻執行 ⌘ [Read more](https://www.readfog.com/a/1724950960648851456) 2024-01-25T11:40:59Z **Go 一文帶你喫透 HTTP 客戶端!**
\*1\. HTTP 請求簡介HTTP(Hypertext Transfer Protocol) 是構建 web 應用通信的基石。HTTP 工作於客戶端 - 服務端架構上。HTTP 客戶端發起請求, 服務器接收請求並返回響應。HTTP 請求主要由請求行、請求頭、請求體組成請求行 GET /search?name=Golang HTTP/1.1請求頭部 Host: www.baidu ⌘ [Read more](https://www.readfog.com/a/1725071814504321024) 2024-01-25T11:44:05Z **Go 信號 - 守護進程開發爬坑指南**
\*一、信號 (signal) 處理信號是 Linux 系統下進程間通信的一種限制式異步通知機制。一個信號可以傳遞一個事件通知給一個進程, 代表一個異步事件。Go 語言內置了對信號的支持, 通過 os/signal 包可以實現 Go 程序對信號的處理。1.1 什麼是信號信號 (Signal) 是 Linux 系統下進程間通信的一種方式。當某個事件發生時, 內核會通知進程一個信號。進程接收到信號後, ⌘ [Read more](https://www.readfog.com/a/1725072009468153856) 2024-01-26T03:03:41Z **Go 使用 cmux 實現網絡端口複用**
cmux 的作用-------- 一般情況下, 每個端口只能爲一個服務所用, 如果複用, 會報 "port is already in use"如果需要複用某個端口, 那麼可以使用 cmux 來實現 (其實大多數情況下必要性不大. 比如我就圖 8888 端口吉利, http/grpc 等服務都用這個端口)cmux[1] 全稱 Connection Mux, 是 Go 生態來複用端口的庫, 可 ⌘ [Read more](https://www.readfog.com/a/1725129866602450944) 2024-01-29T02:38:41Z **Go 司空見慣的錯誤檢測,原來還有這麼多幹貨-**
\*一、錯誤處理機制Go 語言以結果多值返回方式處理錯誤, 函數或者方法最後一個返回值作爲錯誤類型。func ReadFile(filename string) ([]byte, error)調用時根據錯誤值判斷是否正常data, err := ReadFile("abc.txt")if err != nil { // 處理錯誤} else { // 處理data}error 類型及其意義 ⌘ [Read more](https://www.readfog.com/a/1725400083979145216) 2024-01-29T02:36:55Z **ebpf-go 初體驗**
前言我們在《用 eBPF/XDP 來替代 LVS》系列、《一張圖感受真實的 TCP 狀態轉移》系列,以及《如何終結已存在的 TCP 連接?》系列文章中,均通過純 C 語言和 libbpf1 這個庫來運用 eBPF。但是很多的場景中(尤其是雲原生場景),我們出於避免重複造輪子、更快的迭代速度、運行時安全等原因,會選擇 go 語言來進行開發,ebpf-go2 這個庫就是當前最好的選擇。今天,我們就對 ⌘ [Read more](https://www.readfog.com/a/1725399972969549824) 2024-01-29T03:02:27Z **圖文講透 Golang 標準庫 net-http 實現原理 -- 服務端**
前言今天分享下 Go 語言 net/http 標準庫的內部實現邏輯,文章將從客戶端 (Client)-- 服務端(Server) 兩個方向作爲切入點,進而一步步分析 http 標準庫內部是如何運作的。由於會涉及到不少的代碼流程的走讀,寫完後覺得放在一篇文章中會過於長,可能在閱讀感受上會不算很好,因此分爲【Server--Client 兩個篇文章】進行發佈。本文內容是【服務端 Server 部分】, ⌘ [Read more](https://www.readfog.com/a/1725401579412099072) 2024-01-29T03:26:36Z **史上最詳細的 Gin 中間件使用教程**
在本文中,我們將深入討論 Go-Gin 的中間件,詳細瞭解它們呈現如何有效地在任何特定的 Web 應用程序中插播操作。此外,我們還將瀏覽一些示例,幫助大家更好地理解。什麼是中間件?-------在討論 Gin 中間件之前,首先我們需要明確中間件的概念。中間件基本上是一個函數,它在您的應用程序收到請求和發送響應之間插播處理。在實際開發中,中間件被廣泛用於處理如日誌記錄、身份驗證、會話管理等方面。Gi ⌘ [Read more](https://www.readfog.com/a/1725403099138461696) 2024-01-30T02:58:41Z **Golang 有必要實現 async-await 嗎?**
前言 今天在某站上面看到一個大佬解釋 Golang 中的錯誤處理 err !=nil 時,直接用 Javascript 的 async/await 來解釋。async/await 語法糖在 C#, Python 和 Javascript 中是很常見的異步協程寫法,而在 Golang 中則是使用 goroutine 機制。這時習慣或者喜歡 async/await 語法糖的人可能就會有疑問:Gola ⌘ [Read more](https://www.readfog.com/a/1725491939922513920) 2024-01-30T11:58:33Z **Go Gin 框架實現優雅地重啓和停止**
在 Web 應用程序中,有時候我們需要重啓或停止服務器,無論是因爲更新代碼還是進行例行維護。在這種情景下,我們需要保證應用程序的可用性和數據的一致性。這就需要優雅地關閉和重啓應用程序,即不丟失正在處理的請求和不拒絕新的請求。在本文中,我們將詳解如何在 Go 語言中使用 Gin 這個框架實現優雅的重啓和停止。什麼是優雅重啓和停止----------優雅地重啓或停止一個 Web 服務就是指當我們需要更 ⌘ [Read more](https://www.readfog.com/a/1725525904488239104) 2024-01-30T12:03:28Z **使用 Go 發送微信羣消息**
背景最近的某個副業需要我寫一個腳本(腳本內容就不說了),需要通知羣成員,儘快地做出響應。所以去找一下 Go 是否有這樣的類庫。在這個腳本里面,我只需要發送信息的能力即可。openwechat在尋找了一會之後發現 https://github.com/eatmoreapple/openwechat 這個庫,這個庫支持以下能力:消息回覆、給指定對象(好友、羣組)發送文本、圖片、文件、emoji 表情等 ⌘ [Read more](https://www.readfog.com/a/1725526213847519232) 2024-01-30T12:02:53Z **Go 實現多租戶示例**
在 Go 中實現多租戶 (multi-tenancy) 通常涉及到下面幾個關鍵步驟:租戶識別: 你需要一個機制來區分請求是針對哪個租戶的。這可以通過多種策略實現,比如在 HTTP 請求的 URL、Header 或者是 Cookie 中嵌入租戶 ID。 數據隔離: 根據你選擇的數據隔離策略(如數據庫、schema 或者數據表的隔離),你需要確保租戶只能訪問到屬於他們的數據。 中間件 / ⌘ [Read more](https://www.readfog.com/a/1725526177266896896) 2024-01-31T03:31:46Z **Go Web 開發不得不說的請求路由**
\*1\. 請求路由的概念請求路由的定義:請求路由是指將客戶端的請求與服務器上對應的處理程序匹配和映射的過程。它決定了不同的 URL 或 API 請求被映射到哪些處理函數。請求路由的作用:請求路由實現了請求與處理函數之間的解耦,使代碼更加模塊化。同時,它也使得 URL 和 API 更符合 RESTful 設計規範。請求路由還可以實現諸如負載均衡、緩存、日誌記錄、身份驗證等功能。2. net/http ⌘ [Read more](https://www.readfog.com/a/1725584617935835136) 2024-02-01T03:49:06Z **Wasm on Go**
本篇內容,是對極客兔兔: Go WebAssembly (Wasm) 簡明教程 [1] 的實踐與記錄,主體內容來自這篇博客,推薦閱讀原文。 是否需要搭建 wasm 環境? WebAssembly 上手 [2]如果是 C/C++,需要藉助 emcc,將 C 和 C++ 代碼編譯到 WebAssembly 和 JavaScript。在 Mac 上,brew install emscripten然後 ⌘ [Read more](https://www.readfog.com/a/1725676304926347264) 2024-02-02T02:41:06Z **替代 zap,Go 語言官方實現的結構化日誌包**
在 Go 1.21 中,引入了一個新的 log 包 -- log/slog,這是一個強大的日誌記錄庫,提供了許多用於幫助開發人員更加有效地記錄、管理和理解日誌的工具。無論你是一個初級還是高級的 Go 開發人員,理解和掌控 go 的日誌系統是非常有用的。接下來,讓我們深入研究一下 Go 中的日誌行爲,並通過實例來詳細理解每個主要功能。安裝--在 Go 1.21 中,log/slog 是系統自帶的,無 ⌘ [Read more](https://www.readfog.com/a/1725762623857856512) 2024-02-02T02:42:37Z **使用 Go Gin SecureJSON 技術保護你的 JSON 數據**
網絡上的安全問題一直是不能小覷的難題,尤其在 web 開發中,JSON 劫持就是其中的一種。這篇文章,我們將聚焦在 Go 框架 Gin 下的 SecureJSON 使用,來保護我們的 JSON 數據。什麼是 JSON 劫持?------------JSON 劫持是一種網絡攻擊手段,攻擊者利用 JavaScript 的這個特性獲取到不屬於自己的數據。由於 JSON 數據一般包含非常敏感的個人信息,例 ⌘ [Read more](https://www.readfog.com/a/1725762718986768384) 2024-02-05T07:22:26Z **使用 Go 打造百億級文件系統的實踐之旅**
JuiceFS 企業版是一款爲雲環境設計的分佈式文件系統,單命名空間內可穩定管理高達百億級數量的文件。構建這個大規模、高性能的文件系統面臨衆多複雜性挑戰,其中最爲關鍵的環節之一就是元數據引擎的設計。JuiceFS 企業版於 2017 年上線,經過幾年的不斷迭代和優化,在單個元數據服務進程使用 30 GiB 內存的情況下,能夠管理約 3 億個文件,並將元數據請求的平均處理時間維持在 100 微秒量級 ⌘ [Read more](https://www.readfog.com/a/1726052114456743936) 2024-02-05T07:21:17Z **Go1-22 新特性:增強 http-ServerMux 路由能力,將有更強的表現力!**
大家好,我是煎魚。Go1.22 有一個比較重要的新特性,那就是基於提案《net/http: enhanced ServeMux routing[1]》,增強了 http.ServerMux 的路由匹配能力。非常值得大家學習和關注。本次的新特性主要是新增了 HTTP 方法和路徑變量的支持。快速學習----在 Go 中,可以認爲幾乎所有的路由相關的庫都會基於 net/http 或是兼容其 interf ⌘ [Read more](https://www.readfog.com/a/1726052042812788736) 2024-02-05T07:20:39Z **收到請求數據的常用安全驗證方案,go 語言,gin 框架**
在使用 Gin 框架處理前端請求數據時,必須關注安全性問題,以防範常見的攻擊。本文將探討 Gin 框架中常見的安全問題,並提供相應的處理方法,以確保應用程序的穩健性和安全性。第一章:概述----------1.1 安全性的重要性處理前端請求數據時,確保應用程序的安全性是至關重要的。常見的攻擊方式包括 SQL 注入、跨站腳本攻擊(XSS)、跨站請求僞造(CSRF)等。下面我們將逐一探討這些問題及其處 ⌘ [Read more](https://www.readfog.com/a/1726052002694270976) 2024-02-05T07:17:50Z **Go 語言通知協程退出 -取消- 的幾種方式**
在 Go 語言中,控制 goroutine 的退出或取消很重要,這能使資源得到合理利用,避免潛在的內存泄露。如下是一些在 Go 中通知協程退出的常見方式:使用通道(Channel):通過發送特定的信號或關閉通道來通知協程退出。這是最簡單直接的方法。 使用 context 包:context 包提供了一種更標準化的方式來傳遞取消信號、超時、截止時間等控制信息。 使用 sync.Wait ⌘ [Read more](https://www.readfog.com/a/1726051825268920320) 2024-02-05T07:28:29Z **Go Gin 項目記錄日誌的最佳實踐**
在任何一個複雜的軟件項目中,日誌記錄是必不可少的。無論是調試程序、監控系統狀態,還是統計用戶行爲,日誌都扮演了重要的角色。在 Go 的世界裏,Gin 是一種快速,簡單,靈活,優雅的 Web 框架,同時也提供了豐富的日誌記錄功能。本文將分享在 Gin 項目中如何進行高效的日誌記錄。創建 Gin 實例與中間件使用---------------在創建 Gin 實例時,gin.Default()會默認加載 ⌘ [Read more](https://www.readfog.com/a/1726052495941275648) 2024-02-05T07:34:50Z **Go 防止流量過載的利器——限流組件**
\*一、服務流量限制的重要性隨着業務規模的增長, 服務的流量也會激增, 大流量可能會壓垮服務器, 導致服務癱瘓。因此需對服務的流量進行限制, 確保在大流量的情況下也能正常運行。當流量激增時, 會佔用大量服務器資源和帶寬, 可能會壓垮整個系統。比如流量激增期間數據庫連接用盡, 會導致服務無法訪問數據庫而宕機。用限制流量可以有效防止流量暴增壓垮系統。沒有限流時, 流量激增期間會啓動很多無用的任務佔用服務 ⌘ [Read more](https://www.readfog.com/a/1726052895118430208) 2024-02-06T02:48:35Z **Go Gin 框架中間件中使用 Goroutine 的正確姿勢**
在 Go 語言的 Gin 框架中,中間件和處理函數是處理 HTTP 請求的核心。有時候,我們需要在這些函數中啓動新的 Goroutine 來執行併發任務。然而,在 Goroutine 中直接使用 Gin 的上下文(gin.Context)可能會導致競態條件,因爲 Gin 的上下文不是併發安全的。本文將詳細介紹如何在 Gin 中間件或處理函數中正確地使用 Goroutine,並提供示例代碼來說明如何 ⌘ [Read more](https://www.readfog.com/a/1726125482614820864) 2024-02-18T03:48:05Z **GO 中高效 int 轉換 string 的方法與源碼剖析**
Go 語言 中,將整數(int)轉換爲字符串(string)是一項常見的操作。本文將從逐步介紹幾種在 Go 中將 int 轉換爲 string 的常見方法,並重點剖析這幾種方法在性能上的特點。另外,還會重點介紹 FormatInt 高效的算法實現。使用 strconv.Itoa-----------------最直接且常用的方法是使用 strconv 包中的 Itoa 函數。Itoa 是 “Int ⌘ [Read more](https://www.readfog.com/a/1727216390064148480) 2024-02-18T03:47:31Z **Golang 實現協程池**
Go 協程池解決的問題:當需要創建大量的goroutine的時候,如果不限定goroutine的數量,將是對程序的巨大災難 使用完的goroutinue可以複用繼續執行下一個任務(而不是立即銷燬),如果每次都是創建新goroutinue執行任務,頻繁的創建銷燬goroutinue導致利用率低下 項目地址 https://github.com/gofish2020/easygpool 歡 ⌘ [Read more](https://www.readfog.com/a/1727216354323435520) 2024-02-18T03:49:12Z **使用 Gin 框架中的 PureJSON 發送未轉義的 JSON**
當我們使用 Go 的 Gin web 框架來構建 RESTful API 時,通常會遇到返回 JSON 響應的需求。Gin 框架提供了c.JSON方法來以 JSON 格式發送回覆,同時它會對特殊字符進行轉義,比如把 < 轉換爲 \\u003c。但在某些情況下,我們需要發送未轉義的 JSON 數據,這時我們就可以使用 Gin 框架中的c.PureJSON方法。在 Gin 框架中,c.PureJSON方 ⌘ [Read more](https://www.readfog.com/a/1727216460122656768) 2024-02-18T03:58:03Z **Go 語言版本 1-22 的路由增強功能**
Go 1.22 對 net/http包中的路由器進行了兩項增強:方式匹配和通配符。這些特性允許你將常見的路由表示爲模式,而非 Go 代碼。儘管這些功能簡單易解釋和使用,但想選擇成功模式的正確規則(當多個模式匹配一個請求時)依然是個挑戰。我們作出這些改變是爲了持續讓 Go 成爲構建生產系統的優秀語言。我們研究了許多第三方 web 框架,提取出我們認爲最常用的特性,並將它們集成進 net/http。然 ⌘ [Read more](https://www.readfog.com/a/1727217016528539648) 2024-02-19T03:04:43Z **Go 中最常用的數據校驗庫**
項目地址: github.com/go-playground/validator/v10\| 標記 \| 標記說明 \| 例 \|\| --- \| --- \| --- \|\| required \| 必填 \| Field 或 Struct validate:"required" \|\| omitempty \| 空時忽略 \| Field 或 Struct validate:"omitempty" \|\| len ⌘ [Read more](https://www.readfog.com/a/1727304258190151680) 2024-02-19T03:02:16Z **Go Gin 框架的模型綁定與驗證詳解**
在 Web 開發中,模型綁定和驗證是確保數據完整性和減少安全風險的重要步驟。Go 語言的 Gin 框架提供了強大而靈活的模型綁定和驗證機制,本文將深入講解 Gin 框架中如何進行模型綁定和驗證,以及如何自定義驗證器。在 Gin 框架中,模型綁定通常指將請求的數據(例如 JSON、表單數據)綁定到指定的結構體上,而驗證則是確保綁定後的數據符合我們設置的規則。Gin 框架使用binding標籤來實現模 ⌘ [Read more](https://www.readfog.com/a/1727304104583204864) 2024-02-19T03:33:03Z **Go 更強的代碼潔癖,可以把 gofmt 給換了!**
大家好,我是煎魚。我們從一開始寫 Go 代碼和應用,就會被各種官方和民間教程,甚至 IDE 教導我們必須配一個 gofmt 工具。他能夠格式化 Go 程序的代碼。會使用製表符表示縮進,空白表示對齊。這解決了程序員屆的老大難問題之一,代碼格式上的規範問題。有效的提高了 Go 代碼的閱讀的友好度和減少了同事間的 \*\*\*\*。非常值得認可。但有時候,還是會看到一些糟心的代碼,總會覺得 gofmt,還是格式 ⌘ [Read more](https://www.readfog.com/a/1727306040488333312) 2024-02-20T03:34:07Z **Go Gin 框架定義路由日誌格式**
在本文中,我們將深入探討如何在 Go 語言的 Gin 框架中自定義路由日誌的格式。Gin 是一個高性能的 HTTP web 框架,它提供了一個默認的日誌格式,但在實際的開發環境中,我們可能需要根據特定的業務需求調整日誌輸出的格式。我們將從瞭解 Gin 的默認日誌格式開始,逐步地引導你自定義和擴展路由日誌的輸出方式。文章內容將詳實介紹相關的代碼實現,以確保你能夠在自己的工作中靈活運用。Gin 框架默 ⌘ [Read more](https://www.readfog.com/a/1727396704789041152) 2024-02-21T02:40:21Z **程序員必會的任務調度實踐**
\*1\. 延時任務系統介紹延時任務系統 (Delayed Job System) 是一種用於設置任務在將來的某個時刻自動觸發執行的機制。定義:延時任務系統使作業 / 任務能夠在未來的某個預定義時間運行。簡單來說, 就是一種可以設置任務在未來執行的系統。延時任務系統的主要特點是:時間觸發: 根據預設的時間來自動觸發任務執行可靠性: 具備容錯能力, 防止任務丟失擴展性: 可以水平擴展, 提高吞吐量靈活性 ⌘ [Read more](https://www.readfog.com/a/1727483918974816256) 2024-02-21T02:39:32Z **精心設計的 DNS Failover 策略在 Go 中竟然帶來了反效果,發生了什麼?**
本期作者衛智雄嗶哩嗶哩高級運維工程師一. 背景如下配置所示,我們在 /etc/resolv.conf 中配置了兩個 nameserver,其中 server2 在災備機房 ,作爲一種 failover 策略。nameserver server1nameserver server2options timeout:1 attempts:1我們的預期是如果 server1 服務正常,則所有的 DNS 請 ⌘ [Read more](https://www.readfog.com/a/1727483867386974208) 2024-02-21T03:22:57Z **在 Golang 中 如何實現 NATS JetStream 隊列**
NATS JetStream 是一個高性能、持久化、分佈式消息隊列系統,它爲發佈 / 訂閱、隊列和流式處理提供了豐富的功能。在 Go 中實現 NATS JetStream 隊列可以通過 NATS 客戶端庫來完成。一、NATS JetStream 的歷史NATS JetStream 是 NATS 消息系統的一個重要組件,旨在提供持久性消息傳遞和流處理功能。下面是 NATS JetStream 的歷史 ⌘ [Read more](https://www.readfog.com/a/1727486599471665152) 2024-02-22T03:38:32Z **用 Go 語言實現劉謙春晚魔術,還原尼格買提汗流浹背的尷尬瞬間-**
龍年春晚如期而至,想必大家都看(沒)完(眼)了(看)吧,今年春晚最搞笑節目,當屬劉謙的魔術:《守歲共此時》,不過笑點不是節目本身,而是本場魔術的 托兒(主持人)尼格買提。小尼:已經開始流汗了 😅。本文將帶大家一起用 Go 語言來還原下整個魔術的過程。 在開始寫代碼前,翻車畫面必須置頂 🤣:這是一個公式魔術,即有着固定的套路,從數學角度來看是一個「約瑟夫問題」(嚴格證明可以在網上搜到,如果你感興趣 ⌘ [Read more](https://www.readfog.com/a/1727578176606015488) 2024-02-22T03:43:10Z **Golang 流水線設計模式實踐**
流水線設計模式對於順序處理業務數據非常有用,可以以一致的方式直觀的定義對數據的處理流程。原文: Using a Pipeline Pattern in Golang[1]到目前爲止,我已經將 Golang 整合到項目中有一段時間了,Golang 是一種非常強大的語言,我渴望在其生態系統中進一步磨練技能。基於項目的特定需求,我需要實現流水線模式 (Pipeline Pattern),數據需要通過 ⌘ [Read more](https://www.readfog.com/a/1727578468096512000) 2024-02-22T03:41:58Z **Go Gin 框架與 Let's Encrypt 集成指南**
本文將深入探討如何在 Go 語言的 Gin 框架中集成 Let's Encrypt,以實現自動化管理 SSL/TLS 證書。Let's Encrypt 作爲一個免費、自動、開放的證書頒發機構,能讓 HTTPS 部署變得簡單便捷。通過該教程,您將瞭解到如何配置 Gin 以支持 HTTPS 服務,並自動從 Let's Encrypt 申請和續簽證書,確保 Web 應用的安全可靠性。爲什麼需要 Let' ⌘ [Read more](https://www.readfog.com/a/1727578392472162304) 2024-02-22T03:40:22Z **Golang 如何有效限制併發數?**
Go 語言目前很火熱,一部分原因在於自身帶 “高併發” 的標籤,其本身就擁有優秀的併發量和吞吐量。1 協程可以無限創建嗎?我們在日常開發中會有高併發場景,有時會用多協程併發實現。在高併發業務場景,能否可以隨意開闢 goroutine 並且放養不管呢?畢竟有強大的 GC 和優越的 GMP 調度算法。看下面的代碼:package mainimport (    "fmt"    "math"    " ⌘ [Read more](https://www.readfog.com/a/1727578292629901312) 2024-02-22T03:46:12Z **Golang 使用 Zookeeper 實現分佈式鎖**
什麼是分佈式鎖?--------分佈式鎖是一種在分佈式系統中用於控制併發訪問的機制。在分佈式系統中,多個客戶端可能會同時對同一個資源進行訪問,這可能導致數據不一致的問題。分佈式鎖的作用是確保同一時刻只有一個客戶端能夠對某個資源進行訪問,從而避免數據不一致的問題。分佈式鎖的實現通常依賴於一些具有分佈式特性的技術,如 ZooKeeper、Redis、數據庫等。這些技術提供了在分佈式環境中實現互斥訪問的 ⌘ [Read more](https://www.readfog.com/a/1727578659645132800) 2024-02-23T03:11:19Z **分佈式搜索引擎,你真的懂嗎?**
\*一、分佈式搜索引擎簡介(一) 概念分佈式搜索引擎通過在多臺服務器上分配索引和搜索負載, 實現索引和搜索吞吐能力的橫向擴展。主要特徵: 索引和搜索負載分佈在多臺服務器 支持大規模數據和訪問量 (二) 與集中式搜索引擎區別集中式搜索引擎在單個節點上完成全部工作, 硬件資源限制其擴展能力。分佈式搜索引擎通過分佈式計算技術, 實現可橫向擴展的大規模搜索引擎。(三) 優勢 處理更多文檔, 支持 ⌘ [Read more](https://www.readfog.com/a/1727667061876953088) 2024-02-23T03:10:17Z **Go Module 語義化版本規範**
Go Module 的設計採用了語義化版本規範,語義化版本規範非常流行且具有指導意義,本文就來聊聊語義化版本規範的設計和在 Go 中的應用。語義化版本規範語義化版本規範(SemVer)是由 Gravatars 創辦者兼 GitHub 共同創辦者 Tom Preston-Werner 所建立,旨在解決 依賴地獄 問題。它清楚明瞭的規定了版本格式、版本號遞增規:版本格式:採用 X.Y.Z 的格式,X ⌘ [Read more](https://www.readfog.com/a/1727666996801277952) 2024-02-23T09:14:53Z **Go 利用上下文進行併發計算**
在 Go 編程中,上下文(context)是一個非常重要的概念,它包含了與請求相關的信息,如截止日期和取消信息,以及在請求處理管道中傳遞的其他數據。在併發編程中,特別是在處理請求時,正確處理上下文可以確保我們尊重和執行請求中設定的限制,如截止時間。讓我們通過一些代碼示例來探討如何在併發計算中使用上下文,以及如何在處理請求時尊重上下文所設定的截止日期和取消要求。// download 函數用於下載給 ⌘ [Read more](https://www.readfog.com/a/1727689934608896000) 2024-02-23T09:44:50Z **Golang 數據結構性能優化實踐**
僅僅通過對 struct 字段重新排序,優化內存對齊方式,就可以獲得明顯的內存和執行效率提升。原文: How to Speed Up Your Struct in Golang[1]如果你有 Golang 開發經驗,一定定義過 struct 類型。但可能你不知道,通過簡單的重新排序 struct 字段,可以極大提高 Go 程序的速度和內存使用效率!是不是難以置信?我們一起來看一下吧!簡單 De ⌘ [Read more](https://www.readfog.com/a/1727691819517579264) 2024-02-23T09:43:53Z **如何正確處理 Go 項目中關於文件路徑的問題**
在使用 Go 開發項目時,估計有不少人遇到過無法正確處理文件路徑的問題,特別是剛從如 PHP、python 這類動態語言轉向 Go 的朋友,已經習慣了通過相對源碼文件找到其他文件。這個問題能否合理解決,不僅關係到程序的可移植性,還直接影響到程序的穩定性和安全性。本文將嘗試從簡單到複雜,詳細介紹 Go 中獲取路徑的不同方法及應用場景。歡迎關注我的公衆號:引言首先,爲什麼要獲取文件路徑?一般來說,程序 ⌘ [Read more](https://www.readfog.com/a/1727691759573635072) 2024-02-23T09:43:21Z **使用 Templ 進行 Go 模板化**
使用 Templ 在 Go 項目中高效生成動態內容的指南----------------------------動態內容生成是 Web 開發的一個基本方面。無論您是在構建網站、Web 應用程序還是 API,根據數據和模板生成動態內容的能力都至關重要。在 Go 編程世界中,一個名爲 “Templ” 的強大工具簡化了這一過程。在這份全面的指南中,我們將探索使用 Templ 進行 Go 模板化,它的關鍵 ⌘ [Read more](https://www.readfog.com/a/1727691726279249920) 2024-02-23T09:42:37Z **Golang 泛型入門指南**
Go 語言中的泛型是指一種語言特性,允許創建可以處理不同類型的函數、數據結構和接口。換句話說,泛型使得可以創建不受特定類型或數據結構限制的代碼。如果我們此前有使用 Java 或者 C++ 的經驗,那麼會很好理解。在 Go 語言引入泛型之前,開發人員必須編寫多個函數來處理不同類型的數據。這種方法通常很繁瑣,並導致代碼重複。有了泛型,開發人員可以編寫更簡潔和可重用的代碼,可以處理不同類型的數據。Go ⌘ [Read more](https://www.readfog.com/a/1727691679411048448) 2024-02-23T10:14:53Z **實現負載均衡器,打造億級流量入口**
\*負載均衡概述什麼是負載均衡負載均衡是指通過某種手段, 將任務合理地分配到多個操作單元上進行執行, 從而使得系統的負載分散在不同操作單元上, 避免因爲單個操作單元負載過高而影響請求服務能力的技術手段。比如將大量的客戶端請求分擔給多個服務器處理, 從而避免單個服務器超負荷工作對服務的影響。負載均衡的作用負載均衡主要有以下幾個作用: 1\. 降低單個服務器的壓力, 防止服務器過載; 2. 增 ⌘ [Read more](https://www.readfog.com/a/1727693709639782400) 2024-02-26T03:01:25Z **golang 高性能無 GC 的緩存庫 bigcache 是怎麼實現的?**
我們寫代碼的時候,經常會需要從數據庫裏讀取一些數據,比如配置信息或者諸如每週熱點商品之類的數據。如果這些數據既不經常變化,又需要頻繁讀取,那比起每次都去讀數據庫,更優的解決方案就是將它們放到應用的本地內存裏,這樣可以省下不少數據庫 IO,性能嘎一下就上來了。那麼現在問題就來了,假設我要在某個服務應用裏實現一個緩存組件去存各種類型的數據,該怎麼實現這個組件呢?從一個 map 說起---------- ⌘ [Read more](https://www.readfog.com/a/1727938228979339264) 2024-02-26T03:15:17Z **淺聊 Go 分佈式鏈路追蹤**
在現代複雜的分佈式系統環境中,對應用或系統進行性能診斷,這是一個極具挑戰性的任務。有時候,微服務的問題可能會影響到整個系統的鏈路,引發一系列難以追蹤的問題。對於使用 Go 語言的開發者來說,我們有幸的是,對於鏈路追蹤,我們有強大的工具——Go 的鏈路追蹤。什麼是鏈路追蹤?--------鏈路追蹤是一種性能優化策略,通過跟蹤和管理請求在應用環境中的路徑,我們可以更好地理解系統的行爲、性能瓶頸等問題。 ⌘ [Read more](https://www.readfog.com/a/1727939101400862720) 2024-02-27T03:40:07Z **獲取請求 IP,nginx 配置方案,gin 框架,2024 版,go 語言**
在使用 Gin 框架時,獲取用戶請求的真實 IP 地址涉及到多種情況,尤其在使用代理服務器(如 Nginx)時。本文將詳細介紹如何使用 Gin 自帶方法和其他方式獲取用戶 IP,以及在面對 Nginx 轉發時如何準確獲取客戶端 IP,同時討論與 IP 相關的安全問題及處理方法。第一章:概述------1.1 獲取用戶真實 IP 的重要性獲取用戶的真實 IP 地址是許多應用中必不可少的功能,用於識別 ⌘ [Read more](https://www.readfog.com/a/1728031261156544512) 2024-02-27T03:50:00Z **圖文講透 Golang 標準庫 net-http 實現原理 -- 客戶端**
客戶端的內容將是如何發送請求和接收響應,走完客戶端就把整個流程就完整的串聯起來了!這次我把調用的核心方法和流程走讀的函數也貼出來,這樣看應該更有邏輯感,重要部分用紅色標記了一下,可以着重看下。先了解下核心數據結構 Client 和 Request。Client 結構體type Client struct {     Transport RoundTripper     CheckRedirect ⌘ [Read more](https://www.readfog.com/a/1728031882651734016) 2024-02-28T02:51:59Z **別再手寫配置了!動態配置管理實踐指南**
\*一、分佈式配置的意義1.1 什麼是分佈式配置分佈式配置管理是指在分佈式系統中,對不同節點上的配置文件進行集中式、動態化管理。與傳統通過修改配置文件進行配置相比,分佈式配置管理系統具有以下優點:(1) 中心化管理: 配置集中放在配置服務器上, 方便管理和控制。(2) 動態更新: 支持在線動態修改配置, 服務端會主動推送配置文件更新到客戶端。(3) 高可用 & 數據一致性: 配置服務器會構建集羣防止 ⌘ [Read more](https://www.readfog.com/a/1728118830316752896) 2024-03-01T03:13:05Z **爲什麼 Golang Fasthttp 選擇使用 slice 而非 map 存儲請求數據**
Fasthttp 是一個高性能的 Golang HTTP 框架,它在設計上做了許多優化以提高性能。其中一個顯著的設計選擇是使用 slice 而非 map 來存儲數據,尤其是在處理 HTTP headers 時。爲什麼呢?本文將從簡單到複雜,逐步剖析爲什麼 Fasthttp 選擇使用 slice 而非 map,並通過代碼示例解釋這一選擇背後高性能的原因Slice vs Map:基本概念------- ⌘ [Read more](https://www.readfog.com/a/1728301351736283136) 2024-03-04T06:56:50Z **Go 併發編程 —— I-O 聚合優化(動畫講解)**
背景提要在存儲系統中,在確保功能不受損的前提下,儘量的減少讀寫 I/O 的次數是優化的一個重要方向,也就是聚合 I/O 的場景。讀寫操作雖然都有聚合 I/O 的需求,但各自的重點和實現方法卻有所不同。接下來,我們將分別探討讀和寫請求的聚合優化方法。讀請求的聚合以讀操作中,緩存優化是一種常見的優化手段。具體做法是將讀取的數據存儲在內存中,並通過一個唯一的 Key 來索引這些數據。當讀請求來到時,如果 ⌘ [Read more](https://www.readfog.com/a/1728587219486216192) 2024-03-06T03:25:48Z **深入探究 Go log 標準庫**
Go 語言標準庫中的 log 包設計簡潔明瞭,易於上手,可以輕鬆記錄程序運行時的信息、調試錯誤以及跟蹤代碼執行過程中的問題等。使用 log 包無需繁瑣的配置即可直接使用。本文旨在深入探究 log 包的使用和原理,幫助讀者更好地瞭解和掌握它。使用先來看一個 log 包的使用示例:package mainimport "log"func main() { log.Print("Print") ⌘ [Read more](https://www.readfog.com/a/1728755135893573632) 2024-03-06T03:44:38Z **Golang 編寫 MySQL UDF**
一、MySQL UDF-----------這玩意全稱 “MySQL user-definable function”, 從名字就可以看出來叫 “用戶定義的方法”; 那麼 UDF 到底是幹啥的呢?簡單一句話說就是說: 你可以自己寫點代碼處理數據, 然後把這段代碼編譯成動態鏈接庫 (so), 最後在 MySQL 中動態加載後用戶就可以用了.二、解決方案------由於要檢查數據庫, 但是實際上審查並 ⌘ [Read more](https://www.readfog.com/a/1728756320742510592) 2024-03-08T03:05:14Z **Go 爲什麼不支持從 main 包中導入函數?**
大家好,我是煎魚。作爲一個維護過許多有一定歷史沉澱的 Go 項目的人,在歷史債務下和奇葩需求下,會遇到一些迫於業務需求的技術訴求。訴求上是希望引用多項目,會出現從 main 包(package)中導入相關函數的這種使用訴求。爲了將多 Go 工程合併到一個大單體中使用。問題案例----具體的使用案例如下。我們有一個 Go 應用,目錄結構如下:demo1├── go.mod├── main.go└── ⌘ [Read more](https://www.readfog.com/a/1728935035909804032) 2024-03-08T03:02:48Z **fasthttp 是如何做到比 net-http 快十倍的**
小許之前分享過標準庫 net/http 的實現原理,不過有個 fasthttp 的庫號稱比 net/http 快十倍呢!(畢竟名字就帶 fast 呢😆)哇,性能太強了吧,話不多說,本期小許和大家一起看看 fasthttp Server 端的底層實現,來看看到底是如何做到性能如此之快的,有哪些優秀的特性值得我們學習和借鑑的!Server 端處理流程對比在進行了解 fasthttp 底層代碼實現之前, ⌘ [Read more](https://www.readfog.com/a/1728934883293761536) 2024-03-11T03:47:33Z **slog 終極指南**
在本文中,我們將探討 Go 中的結構化日誌記錄,並特別關注最近推出的 log/slog[1] 軟件包, 這個軟件包旨在爲 Go 帶來高性能、結構化和分級的日誌記錄標準庫。該軟件包起源於由 Jonathan Amsterdam 發起的 GitHub 討論 [2], 後來專門建立了一個提案 [3] 細化設計。一旦定稿,它在 Go v1.21 版本中發佈。在以下各節中,我將全面呈現 slog 的功能, ⌘ [Read more](https://www.readfog.com/a/1729209489163390976) 2024-03-12T02:54:33Z **Go arena 民間庫來了,可以手動管理內存!**
大家好,我是煎魚。上年我們有討論過關於 Go arena 手動管理內存的相關提案。一開始還高歌猛進,但沒想到後面由於嚴重的 API 問題(想把 arena 應用到其他的標準庫中,但會引入大問題):Go 核心團隊中途咕咕咕到現在,沒有新的推動和突破性進展,實屬尷尬。最近有社區的大佬有了新的動作,來自 Grafana 的 @Miguel Ángel Ortuño 開源了一個新的第三方庫 ortuman ⌘ [Read more](https://www.readfog.com/a/1729296752269430784) 2024-03-12T03:26:31Z **4 秒處理 10 億行數據! Go 語言的 9 大代碼方案,一個比一個快**
編譯 \| 核子可樂、凌敏來自 \| InfoQ2024 年開年,Java “十億行挑戰”(1BRC)火爆外網。該挑戰賽要求開發者編寫一個 Java 程序,從一個包含十億行信息的文本文件中檢索溫度測量值,並計算每個氣象站的最小、平均值和最高溫度。“十億行挑戰” 的目標是爲這項任務創建最快的實現,同時探索現代 Java 的優勢。這項挑戰聽起來很簡單。但十億行代碼實際是一項龐大的工程,如果以每個數字 3 ⌘ [Read more](https://www.readfog.com/a/1729298762989408256) 2024-03-13T03:32:32Z **Go 中的高速數據包處理: 從 net-Dial 到 AF_XDP**
推進 Go 的極限: 從 net.Dial 到系統調用、AFPACKET 和極速 AFXDP。數據包發送性能的基準測試。最近, 我編寫了一個 Go 程序, 向數百萬個 IP 地址發送 ICMP ping 消息 [1]。顯然, 我希望這個過程能儘可能快速高效地完成。因此, 這促使我研究各種與網絡棧交互和快速發送數據包的各種方法。這是一個有趣的旅程, 所以在本文中, 我將分享一些學習成果, 並記錄 ⌘ [Read more](https://www.readfog.com/a/1729389739119841280) 2024-03-13T03:31:08Z **寶藏級 Go 語言開源項目——教你自己動手開發互聯網搜索引擎**
DIYSearchEngine 是一個能夠高速採集海量互聯網數據的開源搜索引擎,採用 Go 語言開發。Github 地址: https://github.com/johnlui/DIYSearchEngine 運行方法 首先,給自己準備一杯咖啡。把本項目下載到本地 編譯:go build -o ese \*.go 修改配置文件:cp .env.example .env,然後把裏面的 ⌘ [Read more](https://www.readfog.com/a/1729389651068817408) 2024-03-14T02:48:20Z **Go 錯誤處理:用 select-case 來解決這個歷史難題?**
大家好,我是煎魚。日常看 Go 社區的一些新動態,發現大家對於錯誤處理的新提案是很積極。上次分享了一篇想要用 switch-case 來解決現狀的新提案,不少同學認爲不可行。沒想到 Go 社區的同學腦洞還是很大的,這幾天又整出來個 select-case 的新提案的方式來解決錯誤處理。今天基於此給大家分享一下社區裏的新腦洞。快速背景----本節的背景主要是給不瞭解的同學拉通一下。如果已經知道的可以 ⌘ [Read more](https://www.readfog.com/a/1729477554676535296) 2024-03-15T10:26:15Z **使用 mapstructure 高效解析 Go 語言中的動態數據結構**
在處理數據流(如 JSON、Gob 等)過程中,我們可能不知道底層數據的結構,這時mapstructure庫就能大顯身手了。這款 Go 語言庫可以將通用 map 值解碼爲 Go 本地結構,也可執行反向操作,並提供有用的錯誤處理功能。今天,我們就深入瞭解這個庫,並列舉一些豐富的示例來幫助你掌握它的使用方法。簡介--mapstructure是一款 Go 庫,允許開發者將map[string]inter ⌘ [Read more](https://www.readfog.com/a/1729596961249660928) 2024-03-19T03:18:25Z **Go 語言的雙向鏈表、list 操作和雙向循環鏈表- 這些誰認識?**
雙向鏈表1)雙向鏈表的結構雙向鏈表結構中元素在內存中不是緊鄰空間,而是每個元素中存放上一個元素和後一個元素的地址第一個元素稱爲(頭)元素,前連接(前置指針域)爲 nil 最後一個元素稱爲 尾(foot)元素,後連接(後置指針域)尾 nil 雙向鏈表的優點在執行新增元素或刪除元素時效率高,獲取任意一個元素,可以方便的在這個元素前後插入元素 充分利用內存空間,實現內存靈活管理 ⌘ [Read more](https://www.readfog.com/a/1729932431820165120) 2024-03-19T03:17:41Z **更強大的 Go 執行跟蹤能力**
runtime/trace 包 1] 包含了一個強大的工具, 可用於理解和調試 Go 程序。該功能允許我們在一段時間內對每個 goroutine 的執行進行跟蹤。使用 go tool trace 命令 [2), 我們就可以可視化和探索這些跟蹤數據。跟蹤的魔力在於, 它可以輕鬆揭示程序中一些通過其他方式很難發現的問題。例如, 大量 goroutine 在同一個 channel 上阻塞導致的併發瓶頸, ⌘ [Read more](https://www.readfog.com/a/1729932386148388864) 2024-03-20T02:47:54Z **Goroutine 調度器揭祕**
你以前可能聽說過 Goroutine 調度器,但你對它的工作原理了解多少?它如何將 goroutine 與線程配對?不用着急理解上面的圖像, 因爲我們要從最基本的開始。goroutine 被分配到線程中運行, 這由 goroutine 調度器在後臺處理。根據我們之前的討論, 我們瞭解到以下關於 goroutine 的幾點:就原始執行速度而言, goroutine 並不一定比線程更快, 因爲它們需要 ⌘ [Read more](https://www.readfog.com/a/1730021109296893952) 2024-03-21T02:54:45Z **Go 語言的宕機恢復,如何防止程序奔潰**
Recover 是一個 Go 語言的內建函數,可以讓進入宕機流程中的 goroutine 恢復過來,recover 僅在延遲函數 defer 中有效,在正常的執行過程中,調用 recover 會返回 nil 並且沒有其他任何效果,如果當前的 goroutine 陷入恐慌,調用 recover 可以捕獲到 panic 的輸入值,並且恢復正常的執行。通常來說,不應該對進入 panic 宕機的程序做任何 ⌘ [Read more](https://www.readfog.com/a/1730112137094860800) 2024-03-22T02:43:58Z **OpenTelemetry Go 語言教程**
本教程將演示如何在 Go 中使用 OpenTelemetry,我們將手寫一個簡單的應用程序,並向外發送鏈路追蹤和指標數據。準備示例應用程序--------創建一個扔骰子的程序。在本地新建一個dice目錄,並進入該目錄下。mkdir dicecd dice執行 go mod 初始化。go mod init dice在同一目錄下創建 main.go 文件,並添加以下代碼。package mainimp ⌘ [Read more](https://www.readfog.com/a/1730202055791972352) 2024-03-22T02:54:22Z **go 中更加強大的 traces**
原文地址:More powerful Go execution traces 原文作者:Michael Knyszek 本文永久鏈接: https://github.com/gocn/translator/blob/master/2024/w12morepowerfulgoexecutiontraces.md 譯者:小超人 Go 版本: 1.22+ ru ⌘ [Read more](https://www.readfog.com/a/1730202709702840320) 2024-03-26T02:36:55Z **一文帶你完整了解 Go 語言 IO 基礎庫**
作者 \| 百度小程序團隊 導讀 introduction對於剛接觸 Golang 學習的同學,估計比較難掌握的知識點之一就是文件 IO 處理,光在基礎庫裏會發現 golang 除了 io 包提供文件處理外,os 包,http 包,embed 包都有提供類似的處理,由於 Golang 的繼承表達採用的是隱式的表達, 所以他們之間有什麼關係?能否相互轉換處理?是非常難一眼看出來的。本文就幫大家完整地 ⌘ [Read more](https://www.readfog.com/a/1730563999781720064) 2024-03-27T03:06:41Z **最具研讀價值的 Go 源碼之一:context 包**
前言你瞭解 Context 中的回溯鏈和樹結構嗎?想知道 Context 如何觸發級聯取消嗎?本文將換個角度聊一聊 golang 中的 context,讓你真正理解什麼是 Context。context 包中的代碼雖然只有 600 多行,但已經成爲了併發控制、超時控制的標準做法,可以說是真正的短小而精悍,是十分值得研讀的 Go 源碼之一。本文首先從整體的視角解析了 context 的主要接口和函數 ⌘ [Read more](https://www.readfog.com/a/1730656469804748800) 2024-03-28T02:56:47Z **深入理解 Go 併發,靈活的 goroutine 模型與調度策略**
在go中,協程co-routine被改爲goroutine,一個goroutine只佔幾 kb,因此可以有大量的goroutine存在,另一方面goroutine 的調度器非常靈活,本文給大家介紹下Go併發的方法之goroutine模型與調度策略,感興趣的朋友一起看看吧單進程操作系統早期的單進程操作系統,可以理解爲只有一個時間軸,CPU 順序執行每一個進程 / 線程,這種順序執行的方式,CPU 同 ⌘ [Read more](https://www.readfog.com/a/1730746444061708288) 2024-04-01T02:42:02Z **Go 語言中怎麼使用依賴注入?**
01 介紹在 Go 語言項目開發中,我們處理組件層級之間的依賴關係時,通常我們會先在依賴層級的代碼中實例化被依賴層級,然後調用它的方法,即依賴方需要主動獲取被依賴方。但是,當被依賴層級的代碼發生變化時,依賴層級的代碼也需要修改,耦合性比較高,代碼不方便擴展。所謂依賴注入,即依賴方不再需要主動獲取被依賴方,而是被依賴方主動傳遞給依賴方。本文我們介紹 Go 語言怎麼使用依賴注入。02 Go 語言使用依 ⌘ [Read more](https://www.readfog.com/a/1731107903374462976) 2024-04-01T09:40:49Z **使用 Go 語言打造強大的網絡掃描神器**
在這個信息安全意識日益提高的時代,網絡安全人員需要可靠、靈活且強大的工具來進行日常的網絡掃描和數據收集。在衆多開源項目中,Project Discovery 的 httpx 無疑是一顆璀璨的明星。httpx 是一款能夠執行大量 HTTP 請求的命令行工具,旨在對 Web 服務進行多功能且快速的掃描。它支持 HTTP/2, 支持進行方法、頭等多種格式的複雜查詢,還能檢測 Web 服務器的許多面向安全 ⌘ [Read more](https://www.readfog.com/a/1731134251136552960) 2024-04-02T02:33:14Z **用 Go 語言實現多協程文件上傳,斷點續傳,試試!**
網上很多文件基本都是多協程下載文件要麼就只有單協程的斷點續傳,這裏給大家寫一個支持有進度條的多協程下載文件,也支持斷點續傳。好了,直接看代碼就好了,小編已加上詳細的解釋與說明package mainimport ( "fmt" "io" "os" "regexp" "strconv" "sync" "github.com/qianlnk/pgbar")/\* 需求:1. 多協程下載文件2.斷點續連\* ⌘ [Read more](https://www.readfog.com/a/1731197947539984384) 2024-04-07T02:42:29Z **Golang 如何實現訪問私有成員**
在 Go 語言編程中,我們都知道首字母小寫的成員表明它是不公開的,即私有的。一般情況下,我們無法直接訪問一個包中的私有成員。然而,Go 語言提供了一些不尋常的手段允許我們在特定情況下繞過這一限制。在這篇文章中,我們將深入探討這些技巧,並通過詳細的說明和代碼示例來展示它們的使用方法。但在此必須提醒:這些方法很少用於生產環境,因爲它們破壞了封裝性,很容易帶來難以發現的 bug 和安全問題。在下文,我們 ⌘ [Read more](https://www.readfog.com/a/1731651514024431616) 2024-04-08T02:46:28Z **Golang 如何動態解析 JSON**
Go 以其簡潔高效而聞名,提供了強大的工具用於處理 JSON 數據。雖然基於結構體的解析很常見,但在某些情況下,JSON 結構是動態的或未知的。在本文章中,我們將探討如何使用 Go 語言中的空接口進行動態 JSON 解析,從而實現靈活性,無需預定義結構體。什麼是 Dynamic JSON Parsing動態 JSON 解析指的是能夠處理具有不同結構的 JSON 數據,適應不同模式而無需嚴格定義。在 ⌘ [Read more](https://www.readfog.com/a/1731742361069916160) 2024-04-08T02:45:37Z **使用 Golang 構建你的 LLM API**
大語言模型,像 ChatGPT, Llama 等已經席捲全球,從上圖的數據可以看出,ChatGPT 花了 5 天時間就達到了 100 萬用戶。而 Netflix 則花了近 4 年的時間。本文將使用 Gin 和 Langchain 教你快速構建一套 LLM API。GinGin[1] 是一個用於使用 GoLang 構建 API 的現代、快速的 Web 框架。它被設計爲易於使用、高效且性能出色,利用了 ⌘ [Read more](https://www.readfog.com/a/1731742307869364224) 2024-04-08T02:45:03Z **一文掌握 Golang Empty Struct 的所有用法**
在 Go 語言中,空結構體被用作佔位符,當我們想要創建一個不攜帶任何數據的類型時。這個概念經常被用來表示特定的行爲,或者將該類型用作類似集合的數據結構。下面是個使用空結構體的例子:package mainimport ( "fmt" "unsafe")// EmptyStruct is an empty struct typetype EmptyStruct struct{}func main() ⌘ [Read more](https://www.readfog.com/a/1731742272794497024) 2024-04-09T03:29:55Z **Go HTTP 鏈路追蹤**
Open-Telemetry 的第三方軟件包合集 包括了多個社區中常用庫的 OpenTelemetry 支持。隨着 OpenTelemetry 的不斷迭代,相信整個鏈路追蹤的生態也會越發完善。基於 OTel 的 HTTP 鏈路追蹤-------------------基於 OTel 的 HTTP 客戶端和服務端鏈路追蹤實踐。客戶端實現 HTTP client 的鏈路追蹤。package maini ⌘ [Read more](https://www.readfog.com/a/1731835692303093760) 2024-04-09T03:28:26Z **Golang 使用 Worker Pool 模式釋放併發性能**
我們都知道 Go 具有卓越的併發特性,Worker Pool pattern(工作池模式)是一種併發設計模式,它用於管理一組工作線程以執行任務。本文用一個例子深入講解如何使用 Worker Pool 模式提升程序的併發性能。拋出問題快速計算一個數字數組中每個數字的平方,並返回結果數組(該數組只包含從 1 到 150 的整數)。Pattern 1 : N routines for N numbers ⌘ [Read more](https://www.readfog.com/a/1731835598901186560) 2024-04-10T03:25:35Z **Go 類型安全的 Pool**
池(sync.Pool)是一組可單獨保存 (Set) 和檢索 (Get) 的臨時對象集合。存儲在池中的任何項都可能在任何時候自動移除而無需通知。如果池在移除項時持有該對象的唯一引用,那麼這個對象可能會被釋放掉。池能夠確保在多個 goroutine 同時訪問時的安全性。池的目的在於緩存已分配但未使用的對象以便後續複用,減輕垃圾收集器的壓力。也就是說池的功能是爲了重用對象,目的是減輕 GC 的壓力。類 ⌘ [Read more](https://www.readfog.com/a/1731926016886149120) 2024-04-10T03:38:45Z **gRPC OTel 鏈路追蹤**
Open-Telemetry 的第三方軟件包合集 包括了多個社區中常用庫的 OpenTelemetry 支持。隨着 OpenTelemetry 的不斷迭代,相信整個鏈路追蹤的生態也會越發完善。gRPC 的鏈路追蹤----------採集 gRPC 的 trace 數據,推薦使用 otelgrpc 。安裝依賴。go get go.opentelemetry.io/contrib/instrument ⌘ [Read more](https://www.readfog.com/a/1731926844391919616) 2024-04-11T03:08:52Z **Go 標準庫中的一個設計敗筆:哨兵錯誤**
大家好,我是煎魚。在 Go 的歷史發展中,總是有或多或少的坑。最近遇到一個跟錯誤類型定義和聲明使用有關的小坑。翻了一圈 Go 社區裏的爭論,發現又是一個暫時無法解決的未解之坑。今天分享給大家,平時開發時也可以給自己避避坑,以免有人亂用。快速背景----在 Go 裏有一種錯誤類型的定義,官方叫做哨兵錯誤(Sentinel errors):哨兵錯誤,常用於在程序中與全局變量的值對比。可以參考最常見的 ⌘ [Read more](https://www.readfog.com/a/1732015561185005568) 2024-04-12T03:12:32Z **使用 gofn 和 pipe 助力 Golang 函數式編程**
今天要介紹的是兩個在函數式編程裏面很有用的 package,通過使用 gofn[1] 和 pipe[2] 庫讓 Go 的函數式編程更強大。Go 的函數式編程由於本質上,Go 並不像 Haskell 或 Erlang 那樣是純函數式語言,但這並不意味着我們不能應用函數式編程的概念來編寫簡潔、可讀和高效的代碼。這正是 gofn 和 pipe 發揮作用的地方。gofn 和 pipegofn:一個在 Go ⌘ [Read more](https://www.readfog.com/a/1732106389700055040) 2024-04-15T03:36:47Z **Otter:探索 Go 語言中高效無鎖緩存庫的實現與應用**
在當今軟件開發的背景下,性能優化已經成爲了一個不可或缺的部分。尤其是在緩存技術這一塊,優秀的緩存機制不僅能大幅提高應用的響應速度,更能夠有效減輕後端系統的壓力。今天,我們要深入探究的是 Otter——這是一個針對 Go 語言設計的高性能無鎖緩存庫。接下來,我們將詳細介紹 Otter 的設計原理、特性與使用方法,並通過實例演示如何在 Go 項目中集成 Otter。Otter 緩存庫概述------- ⌘ [Read more](https://www.readfog.com/a/1732379705605197824) 2024-04-15T03:58:06Z **專爲 Go 語言設計的函數式編程庫 fp-go**
背景介紹在編程領域中,函數式編程是一種編程範式,它將計算視爲函數的評估,避免改變狀態和可變數據。然而,Go 語言並沒有內建對函數式編程的支持,這使得在 Go 語言中實現函數式編程變得困難。今天要給大家推薦一個 GitHub 開源項目 IBM/fp-go,該項目在 GitHub 有超過 1.1k Star,用一句話介紹該項目就是:“functional programming library for ⌘ [Read more](https://www.readfog.com/a/1732381047149137920) 2024-04-15T11:06:41Z **用 Go 語言 - Redis 實現分佈式鎖,我還是第一次**
一 爲什麼需要分佈式鎖 共享資源訪問控制: 當多個節點需要同時訪問共享資源時,爲了避免併發寫入導致數據不一致,需要使用分佈式鎖確保同時只有一個節點可以寫入或修改共享資源。避免重複執行: 在分佈式系統中,某些操作可能需要在整個系統中只執行一次,比如定時任務、數據初始化等。爲了避免多個節點同時執行這些操作,需要使用分佈式鎖來確保只有一個節點可以執行。任務協調: 在分佈式任務隊列中,多個節點競爭執行任 ⌘ [Read more](https://www.readfog.com/a/1732408011381641216) 2024-04-15T11:04:42Z **Go 一行代碼測量函數的執行時間**
Golang Tips 是翻譯的 Phuong Le @func25[1] 陸陸續續的發表的推文,目前已經發表 70 + 了。我徵得 Phuong Le 的同意後,會逐步把這些推翻翻譯過來,發佈到公衆號上。因爲是推文,可能原作者的內容比較簡單,比如第一個 tip 就一張圖片,我會相應的進行擴充,豐富其內容。 後續也會在 github 建立一個項目,大家都可以參與進行翻譯。我們可以通過 defe ⌘ [Read more](https://www.readfog.com/a/1732407886445907968) 2024-04-16T03:34:53Z **一文搞定 Golang 字符串:高效編碼的最佳實踐**
本文介紹 Golang 中處理字符串的最佳實踐,確保開發項目中實現最佳的效率、最佳性能並讓代碼更優雅。字符串可以爲 nil 嗎?如下所示,在創建字符串變量時,默認值必須是空字符串 ""。如果我們嘗試使用 nil 值初始化字符串變量,將遇到一個錯誤,提示 nil 不能在變量聲明中用作字符串值。例如:func main() {   var s string   s = nil // Cannot us ⌘ [Read more](https://www.readfog.com/a/1732470183220580352) 2024-04-16T03:32:13Z **Go 實現在線用戶消息推送實戰!**
前言--今天老闆又給下了一個需求,在線用戶的消息推送,這個功能我相信 95% 的產品都有這個需求,比如下面的需求場景1: 運營給在線的用戶推送一些活動或者文案或者公告2: 實時監控和通知:在監控系統中,可以使用消息推送來實時向操作員發送系統警報和通知。例如,當系統出現異常或達到某個閾值時,服務器可以向操作員發送警報消息。3: 社交網絡和新聞資訊:使用消息推送來通知用戶有新的消息、新的粉絲或者新的內 ⌘ [Read more](https://www.readfog.com/a/1732470016010457088) 2024-04-16T03:31:18Z **Go 通過 grpc-protobuf 實現高性能用戶服務實戰,從 0 到 1 超級詳細流程!!**
基礎知識準備在在代碼實戰 gRPC 之前,我們需要了解一些基礎知識:RPC(Remote Procedure Call):遠程過程調用,是一種通信協議,允許應用程序在不同的計算機上請求服務而不需要了解底層網絡細節。 gRPC:gRPC 是一種高性能、開源的遠程過程調用(RPC)框架,由 Google 開發,並基於 HTTP/2、Protocol Buffers 等技術實現。 Proto ⌘ [Read more](https://www.readfog.com/a/1732469958030495744) 2024-04-16T03:49:28Z **又一個 Linux 桌面?用 Go 寫的 FyneDesk**
FyneDesk 是一個易於使用的 Linux/Unix 桌面環境,遵循材料設計原則。它使用 Fyne 工具包構建,旨在易於使用和開發。我們使用 Go 語言,並歡迎任何對項目的貢獻或反饋。爲了完整的桌面體驗,您還需要安裝以下外部工具:arandr 用於修改顯示設置 xbacklight 或 brightnessctl 用於調整筆記本電腦的亮度 目前使用 connman-gtk 來配置 ⌘ [Read more](https://www.readfog.com/a/1732471100895498240) 2024-04-16T03:45:07Z **Go 居然克隆了 Python 的 Requests 庫!**
在現代軟件開發中,HTTP 請求處理是一個重要環節。Grequests 是 Go 語言中一個高效的 HTTP 請求庫,靈感來源於 Python 中廣受歡迎的 Requests 庫。本文將深入講解 Grequests 庫在 Go 語言中的實現和使用,幫助開發者快速掌握其強大功能。功能概述----Grequests 庫爲 Go 開發者提供了一系列的便利功能,使得發送 HTTP 請求變得簡單高效。下面就 ⌘ [Read more](https://www.readfog.com/a/1732470827552706560) 2024-04-16T03:41:54Z **Golang: 打造一個交互式命令行**
Go 非常適合於構建命令行應用程序。我們構建了一個名爲 Dolt 的應用, 它是世界上第一個支持版本控制的 SQL 數據庫。我們爲處理 Dolt 的所有子命令和參數編寫了自己的命令行解析器, 但也許我們不應該這樣做。現在有很多很棒的工具可以替代我們自己編寫的解析器, 如果我們今天開始這個項目, 我們可能會選擇使用它們:spf13/cobra 提供了從簡單的文本命令格式生成代碼的強大支持, 並且可以 ⌘ [Read more](https://www.readfog.com/a/1732470625199558656) 2024-04-17T03:25:31Z **Golang 也可以寫出很棒的 GUI 應用!**
今天聊點輕鬆的,這篇文章會分享一些用 Golang 開發的非常棒的 GUI 應用。 Pixyne第一個是 Pixyne,這是一個照片應用程序,允許你快速查看文件夾中的照片!以下是他們在 Fyne 頁面的鏈接 [1]。EasyLPAC接下來是 EasyLPAC,這個軟件能夠從電腦管理你的 eUICC 卡。這是項目在 GitHub 頁面的鏈接 [2]。Snap接下來是 Snap,這是一個跨平臺的工具 ⌘ [Read more](https://www.readfog.com/a/1732560191191355392) 2024-04-17T03:56:10Z **深入 Go interface: Duck Typing 和多態**
Duck Typing鴨子類型(Duck Typing)是一種編程概念,關鍵在於根據對象的行爲來確定其類型。通常的解釋是通過一個巧妙的例子:根據對象的行爲來判斷它是否是一隻鴨子。如果它游泳像鴨子、嘎嘎叫像鴨子,那麼它就可以被認爲是一隻鴨子。動態語言如 Python 和 JavaScript 自然支持這種特性,但與靜態語言相比,動態語言缺乏重要的類型檢查。Go 語言的接口設計與鴨子類型概念密切相關, ⌘ [Read more](https://www.readfog.com/a/1732562119244746752) 2024-04-17T03:55:51Z **9 個必備的 Go 語言 GitHub 庫**
使用這些不可或缺的 GitHub 庫構建健壯高效的 Go 應用程序---------------------------------在充滿活力的 Golang 開發生態系統中,GitHub 是一個寶庫,提供了許多寶貴的庫和包,這些庫和包簡化了開發工作流程,提高了生產效率,並促進了代碼重用。從 Web 框架到數據庫驅動,GitHub 倉庫託管了大量必備的 Go 庫,使開發人員能夠構建健壯且可擴展的應 ⌘ [Read more](https://www.readfog.com/a/1732562099342774272) 2024-04-17T03:55:25Z **純 Go 實現的 MySQL 引擎——go-mysql-server**
go-mysql-server 是一個用 Go 編寫的 MySQL 兼容的查詢引擎。它不僅是一個解析器,還是一個服務器和查詢執行引擎,完全使用 Go 語言編寫。與 Dolt 一樣,它的目標是成爲 MySQL 的 100% 兼容的替代品。go-mysql-server 具有以下兩個主要用途:作爲 Golang 測試環境中 MySQL 的替代品,使用內置的內存數據庫實現。 通過實現一些接口, ⌘ [Read more](https://www.readfog.com/a/1732562071855403008) 2024-04-17T03:58:26Z **探祕 Go Playground 服務**
什麼是 Playground? Playground 是一個 Web 服務,允許任何擁有網絡瀏覽器的人編寫 Go 代碼,可以立即進行編譯、鏈接並在服務器上運行。這是給好奇的程序員一個在安裝之前嘗試 Go 語言的機會,並給有經驗的 Go 用戶一個方便的實驗場所。當然,在 Playground 上運行的程序種類有一些限制,我們不能簡單地接受任意代碼並在我們的服務器上無限制的運行它。這些程序是在一個刪 ⌘ [Read more](https://www.readfog.com/a/1732562262404730880) 2024-04-17T04:08:26Z **理解並在 Golang 中實現自旋鎖**
在併發編程中,互斥鎖(Mutual Exclusion)是一種常用的同步機制,用於保護關鍵資源並防止數據競態。然而,在特定情況下,特別是當鎖的持有時間很短且線程數量有限時,一種輕量級的鎖稱爲自旋鎖(Spin Lock)可以提供更高的性能。What is a Spin Lock自旋鎖是一種忙等待鎖。當一個線程試圖獲取另一個線程持有的鎖時,它會持續地檢查鎖的狀態(自旋),直到鎖被釋放,然後它就會獲得所 ⌘ [Read more](https://www.readfog.com/a/1732562890740830208) 2024-04-18T11:20:47Z **Go:常見的幾種設計模式解析**
在軟件工程中,設計模式是解決常見問題的一套經典解決方案。Go 語言,作爲一種強調簡潔和高效的編程語言,其設計模式同樣體現了這些理念。本文將探討 Go 語言中常見的幾種設計模式,包括單例模式、工廠模式、策略模式、觀察者模式,並用 UML 創建概念模型來直觀展示這些設計模式的結構。1. 單例模式單例模式確保一個類只有一個實例,並提供一個全局訪問點。在 Go 中,使用私有結構體和公有的獲取實例函數是實現 ⌘ [Read more](https://www.readfog.com/a/1732680689182150656) 2024-04-18T11:23:11Z **golang 開發: goroutine 在項目中的使用姿勢**
很多初級的 Gopher 在學習了 goroutine 之後,在項目中其實使用率不高,尤其一些跨語言過來的人,對併發編程理解不深入,可能很多人只知道 go func(), 或者掌控不夠,謹慎一些,儘量少使用或者不使用,用的話就是 go func(),主要列一下我們這邊的主要使用方法。goroutine 在項目中的使用方法看一下樣例代碼,實際上,我們生產環境中就是這麼使用的。package lo ⌘ [Read more](https://www.readfog.com/a/1732680839679021056) 2024-04-18T11:22:08Z **Go 的線程池和協程池,看這一篇你就懂了**
Golang 線程池與協程池是併發編程中的重要概念,它們可以幫助我們更高效地管理併發任務,提高程序的性能和資源利用率。下面我將詳細解釋這兩個概念,包括它們的實現方式、使用場景以及原理。線程池(Thread Pool)概念:線程池是一種併發設計模式,用於管理線程的創建、銷燬和複用。線程池維護着多個線程,這些線程可以被用來執行任務,任務完成後線程並不立即銷燬,而是返回線程池中等待下一個任務。這樣可以減 ⌘ [Read more](https://www.readfog.com/a/1732680773813768192) 2024-04-19T07:41:08Z **快速優化 Golang 代碼的幾個小 Tips**
本文將提供一些代碼優化指南,希望能夠幫助開發者增強其程序性能並簡化開發,實現更高效和健壯的編碼,解鎖 Golang 應用程序的潛力。 下面是我從自己平時開發常用的實用庫中隨機選擇的一些有用且通用的代碼片段。Tracking Execution Time如果你想要跟蹤 Go 中函數的執行時間,有一個簡單而高效的技巧,只需使用 defer 關鍵字即可實現一行代碼。你只需要一個 TrackTime 函數 ⌘ [Read more](https://www.readfog.com/a/1732757466817597440)