# I am the Watcher. I am your guide through this vast new twtiverse.
# 
# Usage:
#     https://watcher.sour.is/api/plain/users              View list of users and latest twt date.
#     https://watcher.sour.is/api/plain/twt                View all twts.
#     https://watcher.sour.is/api/plain/mentions?uri=:uri  View all mentions for uri.
#     https://watcher.sour.is/api/plain/conv/:hash         View all twts for a conversation subject.
# 
# Options:
#     uri     Filter to show a specific users twts.
#     offset  Start index for quey.
#     limit   Count of items to return (going back in time).
# 
# twt range = 1 2879
# self = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=2479
# next = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=2579
# prev = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=2379
gojq:現代 Golang JSON 查詢神器**
隨着現代應用程序對數據處理和解析需求的不斷增加,JSON 已成爲數據交換的主要格式之一。在 Golang 生態系統中,解析和操作 JSON 數據的工具層出不窮,而 gojq 則是其中一款功能強大且易於使用的 JSON 查詢工具。本文將深入解析 gojq,展示其強大功能和實際應用場景,並通過豐富的示例幫助讀者全面掌握這款利器。什麼是 gojq?---------gojq 是一個用 Go 語言編寫的 ⌘ Read more
探索併發安全的 Go 語言 Map - 深入理解 cmap
在 Go 語言中,內建的map類型並不是線程安全的。也就是說,如果您在沒有任何併發控制的狀態下,在多個 goroutine 中對同一個map同時進行讀寫操作,那麼會出現競態條件(race condition),進而導致不可預見的結果。針對這一問題,地裏特(lrita)開發了cmap(concurrent-map),一個用於提供併發訪問的線程安全的map類型,它可以讓您在 Go 語言中更加方便地進行 ⌘ Read more
Gorm 源碼解析**
我們先通過一張圖來看 Gorm 核心主流程。gorm 主流程1. 初始化 DB 連接----------------使用 database.sql 初始化連接。我們平時所說的數據庫驅動其實就是每個數據庫對 DSN 不同的解析方式,最終底層都是使用的 TCP 建立起數據庫連接。type Connector interface { Connect(context.Context) (Conn, err ⌘ Read more
go 語言是如何實現協程的**
go語言的精華就在於協程的設計,只有理解協程的設計思想和工作機制,才能確保我們能夠完全的利用協程編寫強大的併發程序。Hi,我是 sharkChili ,是個不斷在硬核技術上作死的 java coder ,是 CSDN 的博客專家 ,也是開源項目 Java Guide 的維護者之一,熟悉 Java 也會一點 Go ,偶爾也會在 C 源碼 邊緣徘徊。寫過很多有意思的技術博客,也還在研究並輸出技術的路上 ⌘ Read more
聊聊 go 語言基於 epoll 的網絡併發實現**
在之前的文章中我們已經介紹了 epoll 模型,而本文就從 go 語言源碼的角度來了解一下,go 語言是如何基於 epoll 模型完成高性能的網絡協程併發程序的。Hi,我是 sharkChili ,是個不斷在硬核技術上作死的 java coder ,是 CSDN 的博客專家 ,也是開源項目 Java Guide 的維護者之一,熟悉 Java 也會一點 Go ,偶爾也會在 C 源碼 邊緣徘徊。 ⌘ Read more
Gone 一個基於 Golang 的輕量級依賴注入框架**
Gone 一個基於 Golang 的輕量級依賴注入框架Gone 首先是一個輕量的,基於 Golang 的,依賴注入框架,靈感來源於 Java 中的 Spring Framework;其次,Gone 框架中包含了一系列內置組件,通過這些組件提供一整套 Web 開發方案,提供服務配置、日誌追蹤、服務調用、數據庫訪問、消息中間件等微服務常用能力。文檔https://goner.fun/zh/ ht ⌘ Read more
這次用 Go 語言實現的多協程文件上傳,效果很明顯**
多協程文件上傳是指利用多線程或多協程技術,同時上傳一個或多個文件,以提高上傳效率和速度。通過將文件分塊,每個塊由單獨的協程處理上傳,可以有效減少總上傳時間。Go 語言通過 goroutine 實現多協程文件上傳。多協程文件上傳的基本流程文件分塊:將大文件分成多個小塊,以便多個協程可以同時處理不同的塊。 上傳塊:每個協程負責上傳一個或多個塊。 合併塊:在服務器端接收到所有塊後,將其合併爲 ⌘ Read more
Golang:使用 bcrypt 實現密碼加密和和校驗**
bcrypt 可以用於數據庫中的用戶密碼保存,相比 md5 而言更加的安全可靠文檔https://pkg.go.dev/golang.org/x/crypto/bcrypt 文檔上給出了標準文檔,這個庫是下面這個文件描述的算法 golang 實現:https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf 安裝go ge ⌘ Read more
每個程序員都應該掌握的 Golang 性能優化祕技**
性能分析和優化是所有軟件開發人員必備的技能,也是後臺大佬們口中津津樂道的話題。Golang 作爲一門 “現代化” 的語言,原生就包含了強大的性能分析工具 pprof 和 trace。pprof 工具常用於分析資源的使用情況,可以採集程序運行時的多種不同類型的數據(例如 CPU 佔用、內存消耗和協程數量等),並對數據進行分析聚合生成的報告。trace 工具則關注程序運行時的事件(例如協程狀態切換,G ⌘ Read more
xgo: 一款新鮮出爐的 Go 代碼測試利器**
大家好,我是江湖十年。我曾經寫過一篇文章《測試代碼終極解決方案 Monkey Patching》,裏面介紹了 Go 語言中的猴子補丁方案。如今,時隔數月我又發現了一款新的工具可以實現 Monkey Patching,本文將帶大家一起嚐鮮下這款新的測試工具表現如何。簡介簡單一句話介紹 xgo:它是一款強大的的 Go 測試工具集,功能包括 Trap、Mock、Trace、增量覆蓋率。當然,開發中最常用 ⌘ Read more
使用 Go 語言實現 pping
大家好,我是鳥窩。在前一篇 pping: 被動式 ping,計算網絡時延中,我給大家介紹了 pping 這個工具的原理和使用方法。這篇文章中,我將使用 Go 語言實現 pping 工具。通過這篇文章,你將瞭解到:如何使用 gopacket 來捕獲和解析網絡數據包 如何設置捕獲時長和過濾捕獲的數據包 如何在 CGO 下靜態編譯庫,如 libpcap 瞭解 TCP/IP 協議棧的基本 ⌘ Read more
go3d:Go 語言遊戲方向的高性能 2D-3D 數學庫**
在面向性能的編程世界中,go3d是爲 Go 語言提供的一款 2D/3D 數學庫,致力於提高圖形計算的效率與速度。適用於那些需要進行向量、矩陣等數學計算以實現圖形處理的應用程序,go3d提供了一套豐富的 API,以支持高效的數學運算。下面,我們將深入瞭解這個庫的主要特性、結構和使用方式,以及如何在項目中有效利用它。主要特性----高性能設計:go3d庫主要關注於性能,通過優化算法和數據結構來減少計算 ⌘ Read more
Go Gio:用 Go 語言編寫跨平臺即時模式 GUI 的庫**
在構建現代應用程序的過程中,不同平臺間的兼容性是一個不容忽視的挑戰。Go Gio 是一個用 Go 編程語言開發的庫,它致力於簡化跨平臺 GUI(Graphical User Interface,圖形用戶界面) 的構建工作,提供一種所謂的 "即時" (Immediate Mode) 編程模型。這種模型與傳統的 "保留模式" (Retained Mode) GUI 庫,例如 GTK+ 或 Qt,有所不 ⌘ Read more
Go 項目開發中如何讀取應用配置?**
幾乎所有的後端服務都需要一些配置項來配置我們的服務,一些小型的項目,配置不是很多,可以選擇只通過命令行參數來傳遞配置,但是大型項目配置很多,通過命令行參數傳遞就變的很麻煩,不好維護,標準的解決方案是將這些配置信息保存在配置文件中,由程序啓動時加載和解析。所以對於一個稍微大型點的系統,配置文件加載和解析就是一個剛需。Go 生態中有很多包可以加載並解析配置,目前最受歡迎的是 Viper 包。Viper ⌘ Read more
Cloudflare 最佳實踐:如何通過 Go PGO 回收 CPU
Golang 1.20 在 go 編譯器引入了對配置文件引導優化 (PGO) 的支持。這允許指導編譯器根據系統的真實行爲引入優化。在 Cloudflare 的可觀察性團隊中,我們維護着一些基於 Go 的服務,這些服務在全球範圍內使用數千個內核,因此,即使宣傳的節省 2-7%,也能大幅減少我們的 CPU 佔用空間,而且實際上是免費的。這將減少我們內部服務的 CPU 使用率,釋放這些資源來滿足客戶請求 ⌘ Read more
如何構建現代化的 Go 命令行工具?**
在 Go 項目開發中,我們需要編寫 main 函數,並編譯成爲二進制文件,部署啓動服務。有多種方式可以開發一個 main 函數。例如你可以手擼一個 main 函數,並在 main 函數中處理命令行參數,配置文件解析,應用初始化等操作。如下所示:package mainimport ( "flag" "fmt")func main() { // 解析命令行參數 option1 := flag.Str ⌘ Read more
=
用 Go 實現一個無界資源池**
寫在文章開頭------我們希望通過 go 語言實現一個簡單的資源池,而這個資源池的資源包括但不限於:數據庫連接池 線程池 協程池 網絡連接池 只要這些資源實現我們指定的關閉方法,則都可以通過我們封裝的資源池進行統一管理,需要簡單說明一下這個資源池的要求:需要用戶指定資源以及資源的創建方法。 當協程通過Acquire方法獲取資源時,若發現當前池中有資源可以分配則直接返 ⌘ Read more
GitHub 9-8k 的 Go 語言 2D 遊戲引擎 ebiten
前言--hi,大家好,這裏是白澤。今天給大家分享一個 GitHub 🌟9.8k 的 Go 語言 2D 遊戲引擎。https://github.com/hajimehoshi/ebiten引擎的貢獻者依舊在積極維護,是一個兼具學習 & 娛樂的項目!爲此我也用這個引擎寫了一個生存遊戲: avoid-the-enemies【如下圖】:https://github.com/BaiZe1998/avoid-Read more
Go 通過 ETCD 實現應用選主**
原理Go 服務通過 ETCD client 實現有狀態服務的選主,A、B 兩個服務通過生成相同前綴的 key,並且把自己的 IP 值上傳給 ETCD,由於多個服務間會同時上傳,所以按照相同前綴去獲取創建的 key-value,然後通過時間進行排序,最早創建的則成爲 master。如果成爲 master 的服務一直在線的話,會對 key-value 進行 續約, 當 master 下線不能正常續約的 ⌘ Read more
Go 通道的高級玩法**
大家好!我是 lincyang。在之前的討論中,我們已經探索了 Go 語言中通道(channel)的基本使用和核心概念。今天,我們將深入探討一些更高級的通道操作技巧,特別是單向通道的使用,以及如何通過它們提高代碼的安全性和模塊性。單向通道的介紹在 Go 中,通道通常是雙向的,意味着它們既可以發送數據也可以接收數據。然而,在某些情況下,限制通道只發送或只接收可以提高程序的可讀性和運行時安全。這就是單 ⌘ Read more
Lura:基於 Gin 實現的下一代超高性能 API 網關,支持大量插件!**
在快速發展的技術世界中,管理和分發服務變得愈發重要。API 網關作爲一種服務架構模式,爲微服務架構提供了一種高效的管理方式。近年來,Lura(以前稱爲 KrakenD)在開源社區嶄露頭角,以其輕量級和高性能稱爲熱議的焦點。Lura 項目不僅僅是一個 API 網關,它還提供了豐富的中間件,可以幫助開發者在 Linux 環境中更好地管理微服務。接下來我們將深入探討 Lura 的技術架構,以及如何使用其 ⌘ Read more
Go 如何編寫出可測試的代碼**
之前寫了幾篇文章,介紹在 Go 中如何編寫測試代碼,以及如何解決被測試代碼中的外部依賴問題。但其實在編寫測試代碼之前,還有一個很重要的點,容易被忽略,就是什麼樣的代碼是可測試的代碼?爲了更方便的編寫測試,我們在編碼階段就應該要考慮到,自己寫出來的代碼是否能夠被測試。本文就來聊一聊在 Go 中如何寫出可測試的代碼。本文不講理論,只講我在實際開發過程中的經驗和思考,使用幾個實際的案例,來演示怎樣從根上 ⌘ Read more
使用 OpenTelemetry 實現 Golang 服務的可觀測系統**
這篇文章中我們會討論可觀測性概念,並瞭解了有關 OpenTelemetry 的一些細節,然後會在 Golang 服務中對接 OpenTelemetry 實現分佈式系統可觀測性。Test Project我們將使用 Go 1.22 開發我們的測試服務。我們將構建一個 API,返回服務的名稱及其版本。我們將把我們的項目分成兩個簡單的文件(main.go 和 info.go)。// file: main. ⌘ Read more
單元測試中如何解決文件依賴問題**
現如今的 Web 應用程序往往採用 RESTful API 接口形式對外提供服務,後端接口直接向前端返回 HTML 文件的情況越來越少,所以在程序中操作文件的場景也變少了。不過有些時候還是需要對文件進行操作,比如某個 API 接口需要返回應用程序的 ChangeLog,那麼這個接口就可以通過讀取項目的 CHANGELOG.md 文件內容,將其發送給前端。在編寫單元測試時,文件就成了被測試代碼的外部 ⌘ Read more
Go 項目中使用 Base64Captcha 快速實現網站的驗證碼功能,內置多種類型的驗證碼**
在當今世界,網站的安全性變得越來越重要。驗證碼作爲一種簡單而有效的驗證手段,已經被廣泛應用於各種在線平臺。Base64Captcha 是一個開源的 Go 語言庫,它提供了一個簡單、靈活的方式來生成多種形式的驗證碼,包括數字、字母、數字字母組合、算術式、音頻等形式的驗證碼。本文將深入講解 Base64Captcha 庫的使用方法和特點,幫助你在自己的項目中實現驗證碼功能。Base64Captcha ⌘ Read more
Golang 實現異步隊列**
源代碼已託管至 Github: https://github.com/gofish2020/easyqueue爲什麼需要異步隊列?----------在高併發系統中,如果同時有大量的請求 / 任務需要進行處理,由於系統的負載能力有限,一次性能夠同時處理的請求 / 任務是有限的。那麼這些任務就需要進行排隊,先來的先處理,後來的後處理。如果超過了整個隊列能夠容納的請求 / 任務,那麼後續的請求 / 任 ⌘ Read more
單元測試中如何解決 MySQL 存儲依賴問題**
在編寫單元測試的過程中,如果被測試代碼有外部依賴,爲了便於測試,我們就要想辦法來解決這些外部依賴問題。在做 Web 開發時,MySQL 存儲就是一個非常常見的外部依賴,本文就來探討在 Go 語言中編寫單元測試時,如何解決 MySQL 存儲依賴。HTTP 服務程序示例假設我們有一個 HTTP 服務程序對外提供服務,代碼如下: main.gopackage mainimport ( "encodin ⌘ Read more
單元測試中如何解決 Redis 存儲依賴問題**
在編寫單元測試時,除了 MySQL 這個外部存儲依賴,Redis 應該是另一個最爲常見的外部存儲依賴了。我在《在 Go 語言單元測試中如何解決 MySQL 存儲依賴問題》一文中講解了如何解決 MySQL 外部依賴,本文就來講解下如何解決 Redis 外部依賴。登錄程序示例在 Web 開發中,登錄需求是一個較爲常見的功能。假設我們有一個 Login 函數,可以實現用戶登錄功能。它接收用戶手機號 + ⌘ Read more
Golang 高效處理集合 -Collection- 的庫**
處理集合是構建任何應用程序的重要部分。通常,需要以下幾類操作:轉換:將某個函數應用於集合中的每個元素,以創建一個新類型的新集合; 過濾:選擇滿足特定條件的集合中的元素; 聚合:從集合中計算出單個結果,通常用於彙總; 排序 / 排序:根據某些標準重新排列集合的元素; 訪問:根據其屬性或位置檢索元素的操作; 實用程序:與集合一起工作的通用操作,但不一定完全適合上述分類。 ⌘ Read more
如何使用 Go 語言優雅地實現接口限流**
在衆多 Web 開發中,爲了保障服務器的穩定性,我們常常需要對接口的調用頻率做出限制。而 Go 語言的強大併發性能使其在此領域有出色的表現。本文將向你詳細展示如何利用 Go 語言實現接口限流。限流原理----接口限流的目標是防止接口被過度調用,保護系統資源,包括 CPU、內存和帶寬等。限流通常應用於以下幾種場景:防止 DDoS 攻擊 控制非法爬蟲 公平分配系統資源 限流的實現方式 ⌘ Read more
一致性緩存理論分析與技術實戰**
0 前言工程實踐場景中,我們通常用數據庫完成數據的持久存儲,而數據存儲側的性能調優也是一個永恆經典的話題. 在一些請求量大、讀多寫少的場景中,一種性能優化方式是考慮在數據庫之上添加一層緩存組件,這樣一方面能減輕數據庫的訪問壓力,一方面也能提升查詢操作的性能.然而由於緩存(如 redis)和數據庫(如 mysql)是兩個獨立的存儲組件,在操作過程中無法在跨組件的基礎上保證 “事務” 的語義,因此不可 ⌘ Read more
單元測試中如何解決 HTTP 網絡依賴問題**
在開發 Web 應用程序時,確保 HTTP 功能的正確性是至關重要的。然而,由於 Web 應用程序通常涉及到與外部依賴的交互,編寫 HTTP 請求和響應的有效測試變得具有挑戰性。在進行單元測試時,我們必須思考如何解決被測程序的外部依賴問題。因此,在 Go 語言中,我們需要找到一種可靠的方法來測試 HTTP 請求和響應。本文將探討在 Go 中進行 HTTP 應用測試時,如何解決應用程序的依賴問題,以 ⌘ Read more
Golang 實現枚舉的多種方式及最佳實踐**
枚舉提供了一種表示一組命名常量的方式。雖然 Go 語言沒有內置的枚舉類型,但開發者可以通過常量 / 自定義類型來模擬類似枚舉的行爲。枚舉在編程語言中扮演着至關重要的角色,提供了一種簡潔而富有表現力的方式來定義一組命名常量。雖然像 Java 或 C# 這樣的語言提供了對枚舉的內置支持,但 Go 採用了不同的方法。在 Go 中,枚舉並不是一種原生的語言特性,但開發者有幾種技術可供使用,以實現類似的功能 ⌘ Read more
sqlx: 功能強大的數據庫訪問庫**
sqlx[1] 是一個用於擴展標準庫 database/sql 的庫,它提供了一些額外的功能,使得在 Go 中使用 sql 更加方便。sqlx 的目標是保持 database/sql 的簡單性,同時提供更多的功能。sqlx 爲 Go 的標準 database/sql 庫提供了一組擴展。sqlx 中的 sql.Conn、sql.DB、sql.TX、sql.Stmt、sql.Rows、sql.Row ⌘ Read more
萬字長文——在 Go 中如何編寫測試代碼**
在程序開發過程中,測試是非常重要的一環,甚至有一種開發模式叫 TDD(測試驅動開發),先編寫測試,再編寫功能代碼,通過測試來推動整個開發的進行,可見測試在開發中的重要程度。爲此,Go 語言提供了 testing 框架來方便我們編寫測試,本文將向大家介紹在 Go 中如何編寫測試代碼。測試分類在 Go 中,編寫的測試用例可以分爲四類:單元測試:測試函數名稱以 Test 開頭,如 TestXxx、Tes ⌘ Read more
Go FRP:快速反向代理助您穿越 NAT 或防火牆,輕鬆連接互聯網**
在當前的互聯網架構中,NAT(網絡地址轉換)和防火牆是常見的網絡安全措施,它們爲內網提供了一層保護。然而,這同時也意味着在不進行特別配置的情況下,外部網絡無法直接訪問內網的服務。爲了解決這一問題,Go FRP(Fast Reverse Proxy)應運而生。它是一個快速的反向代理工具,可以幫助您將內網服務安全地暴露到外網,極大地簡化了穿越 NAT 或防火牆的過程。Go FRP 的工作原理----- ⌘ Read more
在 Go 語言中,這樣使用 Json 的**
Encode將一個對象編碼成JSON數據,接受一個interface{}對象,返回[]byte和error:func Marshal(v interface{}) ([]byte, error)Marshal函數將會遞歸遍歷整個對象,依次按成員類型對這個對象進行編碼,類型轉換規則如下:bool類型 轉換爲JSON的Boolean 整數,浮點數等數值類型 轉換爲JSON的Number s ⌘ Read more
使用 Ollama 和 Go 基於文本嵌入模型實現文本向量化**
基於 RAG + 大模型的應用已經成爲當前 AI 應用領域的一個熱門方向。RAG(Retrieval-Augmented Generation) 將檢索和生成兩個步驟相結合,利用外部知識庫來增強生成模型的能力 (如下圖來自網絡)。在 RAG 賦能的大模型應用中,關鍵的一步是將文本數據向量化後存儲在向量數據庫中 (如上圖的紅框),以實現快速的相似度搜索,從而檢索與輸入查詢相關的文本片段,再將檢索到的 ⌘ Read more
Golang 如何實現自定義 CDC 工具?**
CDC變更數據捕獲(CDC)是一種跟蹤數據庫更改的技術,允許開發人員捕獲應用於行的插入、更新和刪除。它是數據集成和實時處理任務的重要組成部分。在本文中,我們將討論如何在 Golang 中爲 PostgreSQL、Oracle、MySQL、MongoDB 和 SQL Server 等多個數據庫開發自定義 CDC 工具。通常在 CDC 領域或者說大數據領域都是 java 的生態比較繁榮,比如 Flin ⌘ Read more
Go 未用代碼消除與可執行文件瘦身**
在日常編寫 Go 代碼時,我們會編寫很多包,也會在編寫的包中引入了各種依賴包。在大型 Go 工程中,這些直接依賴和間接依賴的包數目可能會有幾十個甚至上百個。依賴包有大有小,但通常我們不會使用到依賴包中的所有導出函數或類型方法。這時 Go 初學者就會有一個疑問:這些直接依賴包和間接依賴包中的所有代碼是否會進入到最終的可執行文件中呢?即便我們只是使用了某個依賴包中的一個導出函數。這裏先給出結論:不會! ⌘ Read more
SeaweedFS:基於 Go 語言實現次世代的分佈式存儲解決方案**
在如今這個數據爆炸的時代,企業和開發者迫切地需要一個高效可靠的分佈式存儲系統來管理他們海量的數據。SeaweedFS 以其出色的性能和靈活性,成爲了存儲行業的明星產品。在本文中,我們將深入剖析 SeaweedFS 的核心功能、架構細節,並通過示例來展現它在實際中的應用。SeaweedFS 概覽------------SeaweedFS 是一款開源的分佈式存儲系統,專門設計來處理海量的文件以及數據。 ⌘ Read more
用 Go 語言做了一個分佈式限流器, 看看實現的方法與步驟**
項目中需要對 api 的接口進行限流,但是麻煩的是,api 可能有多個節點,傳統的本地限流無法處理這個問題。限流的算法有很多,比如計數器法,漏斗法,令牌桶法,等等。各有利弊,相關博文網上很多,這裏不再贅述。項目的要求主要有以下幾點:支持本地 / 分佈式限流,接口統一 支持多種限流算法的切換 方便配置,配置方式不確定 go 語言不是很支持 OOP,我在實現的時候是按 Java 的思 ⌘ Read more
Go 命令行參數解析工具 pflag 使用**
在使用 Go 進行開發的過程中,命令行參數解析是我們經常遇到的需求。儘管 Go 標準庫提供了 flag 包用於實現命令行參數解析,但只能滿足基本需要,不支持高級特性。於是 Go 社區中出現了一個叫 pflag 的第三方包,功能更加全面且足夠強大。在本文中,我們將學習並掌握如何使用 pflag。特點pflag 作爲 Go 內置 flag 包的替代品,具有如下特點:實現了 POSIX/GNU 風格的 ⌘ Read more
用 Golang 做一個永久阻塞,有哪些小技巧 ?**
Go 的運行時的當前設計,假定程序員自己負責檢測何時終止一個 goroutine 以及何時終止該程序。可以通過調用 os.Exit 或從 main() 函數的返回來以正常方式終止程序。而有時候我們需要的是使程序阻塞在這一行。使用 sync.WaitGroup 一直等待直到 WaitGroup 等於 0package mainimport "sync"func main() {    var wg ⌘ Read more
Sqids: 簡短唯一 ID 生成器**
Sqids(發音爲squids, 魷魚)是一個開源庫,允許您從數字中生成簡短的唯一且看起來隨機的標識符, 而且這些 ID 是 URL 安全的,你可以同時編碼幾個數字, 也可以剔除常見的髒話或者政治敏感的單詞。你可以把它想象成一個十進制到十六進制的轉換器,但它還具備一些額外的功能。 比如:https://example.com/Lqj8a0先前它叫做Hashids, 但是由於商標問題,我不得不更改名 ⌘ Read more
Goose:Go 語言漸進式的數據庫遷移工具**
數據庫遷移是軟件開發過程中重要的一部分,隨着業務的發展和需求的變化,數據庫結構經常需要做出調整。Goose 是一個出色的數據庫遷移工具,它通過 SQL 腳本和 Go 函數支持漸進式的數據庫變化。下面是一篇詳細的文章,它將深入介紹 Goose 的用法,並提供豐富的示例幫助你開始使用 Goose。Goose 簡介--------Goose 是一款能夠管理數據庫架構變更的工具,提供了一系列命令來幫助開發 ⌘ Read more
Go Heap Profile 怎麼了?**
Go heap profile 是常常用來檢查內存泄露和內存佔用大問題的問題的手段,而且非常常用。而且,我們也經常創建兩個間隔較長的 heap profile, 獲取它們的差值來方便查看內存泄露: Hi, 使用多年的 go pprof 檢查內存泄漏的方法居然是錯的?! [1]今天,度廠的一位同學提出了一個很有意思的案例,讓我們對 heap profile 有了更深的理解。問題: heap prof ⌘ Read more
Go 語言實現輕量級全文檢索引擎**
黎明破曉,我在陽光的照射下觀察到一個光鮮亮麗的開源項目——ZincSearch。這並不是一個大型的項目,但是其優雅而堅韌的特質讓我深深着迷。鑄就在 Go 語言的火爐中,ZincSearch 提供了一個輕量級但功能強大的全文索引搜索引擎,這讓我對其深感興趣。ZincSearch 誕生背景---------------在講述 ZincSearch 之前,首先需要了解它的誕生背景。隨着互聯網技術的迅速發 ⌘ Read more
Go 語言實現開源優雅的跨平臺 USDT 收付中間件**
Epusdt(全稱:Easy Payment Usdt)是一個由 Go 語言編寫的私有化部署 Usdt 支付中間件 (Trc20 網絡)。站長或開發者可以通過 Epusdt 提供的 http api 集成至任何系統,無需過多的配置,僅僅依賴 mysql 和 redis。通過它,可以實現 USDT 的在線支付和消息回調,均可在優雅和瞬間完成。私有化搭建使得無需額外的手續費和簽約費用,Usdt 代幣直 ⌘ Read more
利用 Go 操控 Etcd:構建強一致性系統的祕訣**
etcd 是一個開源的、高可用的分佈式鍵值(key-value)存儲系統,它主要用來共享配置和服務發現。etcd 由 CoreOS 團隊開發,是以 Go 語言編寫的。etcd 採用了 Raft 協議來處理日誌複製以提供強一致性和高可用性,它成爲很多分佈式系統和雲原生技術(如 Kubernetes)中的基礎組件。etcd 的核心特性包括:簡潔的鍵值存儲:etcd 提供 HTTP/JSON API,允 ⌘ Read more
不可思議的快!加速 Docker 中構建 Golang 應用**
這些天我在工作中正在進行一個 GoLang 項目。這與我們通常使用的 Java 和 Spring Boot 應用程序有很大不同, 感覺很不錯:)。和我們所有的其他組件一樣, 這個 GoLang 項目也需要被封裝在一個容器中, 才能在 Kubernetes 集羣中執行。所以我編寫了一個 Dockerfile:構建階段FROM golang:1.22.1-alpine AS buildWORKDIR ⌘ Read more
使用 Makefile 輕鬆管理 Go 項目:提高開發效率的利器**
一、介紹1、make 介紹make是一個構建自動化工具,會在當前目錄下尋找Makefile或makefile文件 如果存在相應的文件,它就會依據其中定義好的規則完成構建任務 2、Makefile 介紹 藉助Makefile我們在編譯過程中不再需要每次手動輸入編譯的命令和編譯的參數,可以極大簡化項目編譯過程。 我們可以把Makefile簡單理解爲它定義了一個項目文件的編譯規則。 ⌘ Read more
Ollama:本地大模型運行指南**
本文作者爲 360 奇舞團前端開發工程師Ollama 簡介---------Ollama 是一個基於 Go 語言開發的可以本地運行大模型的開源框架。官網:https://ollama.com/GitHub 地址:https://github.com/ollama/ollamaOllama 安裝---------下載安裝 Ollama在 Ollama 官網根據操作系統類型選擇對應的安裝包,這裏選 ⌘ Read more
Google 孵化了 3 個 Go 安全庫,推薦使用!**
大家好,我是煎魚。Google 作爲一家用戶體量很大的企業,有非常多的產品,經常會被黑客攻擊或被拿來練手。因此其設計的產品、編程語言、工具庫等都會要求考慮安全性相關的內容。例如:各種供應鏈攻擊、CWE 等安全的查缺補漏等。我們作爲用戶(使用者),可以 “白嫖” 這些功能實現。直接複用在自家的業務上就可以了。這樣每年在護網上都能省不少勁。三個 Go 安全庫---------本次 Google 輸出了 ⌘ Read more
Golang 高效的切片拼接和 Go1-22 中新的拼接方法**
在 Go 中,切片拼接是一種常見操作,但如果處理不當,可能會導致性能問題或意外的副作用。本文將詳細介紹幾種切片拼接的高效方法,討論它們的優缺點以及適當的使用場景。 基本的方法和其限制使用 append 函數最直接的方法是使用 append 函數,它將一個切片的元素添加到另一個切片的末尾。slice1 := []int{1, 2}slice2 := []int{3, 4}result := app ⌘ Read more
=
[langchaingo] 基於 Hugging Face 構建大模型應用**
今天,我們將開始 Golang + LLM 系列的教程,本文將介紹如何在 Hugging Face 上使用 LangchainGo 來實現你的第一個大模型應用!Hugging Face 是什麼?Hugging Face 是一個火爆的人工智能開發社區和平臺,專注於自然語言處理(NLP)領域。該平臺提供了各種各樣的工具和資源,包括預訓練模型、模型庫、數據集、評估指標以及用於開發和部署 NLP 模型的庫 ⌘ Read more
Go 語言將 PDF 轉爲 Word ,代碼怎麼實現?**
將 PDF 轉換爲 Word 這是一個很常見的功能了,用 Go 語言實現,可以通過以下步驟完成:1 安裝 PDF 轉換工具庫:首先需要使用 Go 語言中的 PDF 轉換庫,比如 pdftoword 或 pdfcpu。你可以使用 Go 的包管理工具(如 go get)來安裝這些庫。2 導入依賴庫:在 Go 項目中導入你選擇的 PDF 轉換庫,並確保正確地導入了所有需要的依賴項。3 加載 PDF 文件 ⌘ Read more
gnet:基於 Go 語言的高性能網絡框架**
gnet 是一個基於 Go 語言的事件驅動型網絡框架,其設計宗旨是實現高性能和輕量級。gnet 在底層採用了 epoll 和 kqueue 機制,相較於 Go 語言標準庫 net 在特定場景下有着更好的性能和更低的內存消耗。雖然 gnet 並非旨在取代 Go 語言的 net 庫,但它提供了另一種在 Go 生態系統中構建性能敏感型網絡服務的選擇。通過實現應用層的協議(如 HTTP、RPC、WebSo ⌘ Read more
go-money 實現貨幣運算的金標準**
在進行金融領域的軟件開發時,貨幣值的精確表示和操作至關重要。由於浮點數帶來的精度問題,傳統的處理方式經常導致數值上的細微誤差。針對這一問題,go-money包提供了基於 Go 語言的解決方案,實現了 Fowler 的貨幣模式。本文將深入解析go-money包,演示其具體的使用方式,並通過豐富的示例讓您掌握如何在 Go 項目中實現精確的貨幣計算。起步:安裝 go-money------------- ⌘ Read more
Go 1-22 的新增功能系列之一:cmp-Or**
截至撰寫本文時,Go 1.22 已經發布幾個月了。早就該結束我爲 1.22 所做的工作的系列了。抱歉耽擱了這麼久,我最近忙於生活事務。如果您錯過了我關於 reflect.TypeFor(https://blog.carlana.net/post/2024/golang-reflect-type-for/) 和 slices.Concat(https://blog.carlana.net/post/Read more
使用 GitHub Actions 構建 Golang PGO
今年 2 月,我宣佈 Dolt 版本現已構建爲配置文件引導優化 (pgo) 二進制文件,利用 Golang 1.20 的強大功能將 Dolt 的讀取性能提高 5.3%。在我宣佈這一消息之前,我們的一位常駐 Golang 專家 Zach 試驗並測試了 Golang 的 pgo 功能,並寫下了他在使用 Dolt 構建後觀察到的性能提升,該配置文件首先針對 Dolt 運行我們的 Sysbench 基準測 ⌘ Read more
使用 Go 語言中的 Buffer 實現高性能處理字節和字符串**
在 Go 語言標準庫中,bytes包提供了對 byte slice ([]byte) 的便捷操作,其中Buffer是一個實現了io.Reader和io.Writer接口的可變大小的字節緩衝。我們通常使用Buffer來讀寫數據、處理字符串和字節的過程中實現高性能的操作。Buffer 的使用場景------------Buffer在以下場景中特別有用:當需要一個字節緩衝時 進行字符串的高效拼接 ⌘ Read more
Golang - Jaeger 實現分佈式鏈路追蹤**
什麼是分佈式鏈路追蹤(Distributed Tracing?)?分佈式追蹤是軟件開發和性能監控中使用的一種技術,用於跟蹤和分析請求在分佈式系統的各個組件中的流動。在現代軟件應用中,不同的服務和微服務通常一起工作來滿足用戶請求。這些服務可能分佈在多臺服務器、容器或地理位置上。瞭解這些服務之間的交互並識別瓶頸或性能問題可能是具有挑戰性的。不同服務生成的跨度被收集併發送到一個稱爲追蹤系統的集中式存儲庫 ⌘ Read more
Golang 異步編程方式和技巧**
Golang 基於多線程、協程實現,與生俱來適合異步編程,當我們遇到那種需要批量處理且耗時的操作時,傳統的線性執行就顯得喫力,這時就會想到異步並行處理。下面介紹一些異步編程方式和技巧。作者:zvalhu一、使用方式1.1、最簡單的最常用的方式:使用 go 關鍵詞func main() { go func() {  fmt.Println("hello world1") }() go func( ⌘ Read more
從零到生產:Go 在 Google 的歷程 [譯]**
2007 年 Go 誕生於 Google,2009 年 Google 正式對外宣佈了 Go 語言的開源!時至今日,距離 Go 開源已經過去了近 15 個年頭了 [1]!Go 在 Google 公司內部究竟是怎樣的一個狀態呢?前 Google 員工 Yves Junqueira 近期撰文從其個人所見所聞談了 Go 在 Google 的歷程 [2]!這裏簡單翻譯,供大家參考! 最近,Jeremy Ma ⌘ Read more
*
Go 語言實現 dll 惡意劫持轉發**
dll 轉發概述------------dll 轉發: 攻擊者使用惡意 dll 替換原始 dll,重命名原始 dll 並通過惡意 dll 將原先的功能轉發至原始 dll。該惡意 dll 一般用來專門執行攻擊者希望攔截或修改的功能,同時將所有其他功能轉發至原始 dll一般可與 dll 劫持共同使用。dll 搜索順序首先我們來看一下 Windows 系統中 dll 的搜索順序 上圖中攻擊者可以控制的 ⌘ Read more
基於 go 實現 redis 之主幹框架**
0 前言本着學習和實踐的目的,從本期開始,我將和大家一起走進一個新的專題—— 【基於 go 實現 redis】 .該專題圍繞着我的一個開源項目——goredis 展開. 由於個人水平有限,如有不到位之處,歡迎批評指正:https://github.com/xiaoxuxiansheng/goredis本系列計劃分爲四篇內容:• 基於 go 實現 redis 之主幹框架(本篇): 在宏觀視角下縱覽 ⌘ Read more
訪問 Golang 私有函數、方法、類型和變量**
本文譯自 Yarden Laifenfeld 的 Accessing Private Functions, Methods, Types and Variables in Go https://medium.com/@yardenlaif/accessing-private-functions-methods-types-and-variables-in-go-951acccc05a6你Read more
Go 語言使用 Watermill 構建高性能事件流處理**
在今天的數據驅動世界中,異步通信模式對實現高效的數據處理和服務間通信至關重要。Go 語言因其簡潔的語法、強大的併發支持而成爲處理高併發事件流的理想選擇。在衆多 Go 語言庫中,Watermill 是一個值得關注的事件流處理庫。本文將深入探討 Watermill 的內部機制、優點以及如何在 Go 項目中有效地利用它來處理異步請求。Watermill 簡介------------Watermill 是 ⌘ Read more
Go 語言是 如何實現 HTTP 代理 和 反向代理**
代理的核心功能可以用一句話概括:接受客戶端的請求,轉發到後端服務器,獲得應答之後返回給客戶端。代理的功能有很多,事實上整個互聯網到處都充斥着代理服務器。如果所有的 HTTP 訪問都是客戶端和服務器端直接進行的話,我們的網絡不僅會變得緩慢,而且性能會大打折扣。代理服務器根據不同的配置和使用,可能會有不同的功能,這些功能主要包括:內容過濾:代理可以根據一定的規則限制某些請求的連接。比如有些公司會設置內 ⌘ Read more
分享 Golang 健壯高效的一種重試模式**
在分佈式系統和網絡編程領域,優雅地處理瞬時錯誤是構建彈性應用程序的關鍵方面。應對這些暫時性小故障的一種有效策略是實現重試模式。在這篇博客文章中,我們將深入探討在 Golang 中創建一個健壯的重試模式瞬時錯誤瞬時錯誤,通常在網絡操作中遇到,可能是短暫的故障,可以包括網絡超時、服務器暫時不可用或其他瞬時故障。通過重試來解決這些錯誤可以顯著提高應用程序的可靠性和容錯能力。Golang 重試模式重試模式 ⌘ Read more
快速優化 Golang 代碼的幾個小 Tips
本文將提供一些代碼優化指南,希望能夠幫助開發者增強其程序性能並簡化開發,實現更高效和健壯的編碼,解鎖 Golang 應用程序的潛力。 下面是我從自己平時開發常用的實用庫中隨機選擇的一些有用且通用的代碼片段。Tracking Execution Time如果你想要跟蹤 Go 中函數的執行時間,有一個簡單而高效的技巧,只需使用 defer 關鍵字即可實現一行代碼。你只需要一個 TrackTime 函數 ⌘ Read more
golang 開發: goroutine 在項目中的使用姿勢**
很多初級的 Gopher 在學習了 goroutine 之後,在項目中其實使用率不高,尤其一些跨語言過來的人,對併發編程理解不深入,可能很多人只知道 go func(), 或者掌控不夠,謹慎一些,儘量少使用或者不使用,用的話就是 go func(),主要列一下我們這邊的主要使用方法。goroutine 在項目中的使用方法看一下樣例代碼,實際上,我們生產環境中就是這麼使用的。package lo ⌘ Read more
Go 的線程池和協程池,看這一篇你就懂了**
Golang 線程池與協程池是併發編程中的重要概念,它們可以幫助我們更高效地管理併發任務,提高程序的性能和資源利用率。下面我將詳細解釋這兩個概念,包括它們的實現方式、使用場景以及原理。線程池(Thread Pool)概念:線程池是一種併發設計模式,用於管理線程的創建、銷燬和複用。線程池維護着多個線程,這些線程可以被用來執行任務,任務完成後線程並不立即銷燬,而是返回線程池中等待下一個任務。這樣可以減 ⌘ Read more
Go:常見的幾種設計模式解析**
在軟件工程中,設計模式是解決常見問題的一套經典解決方案。Go 語言,作爲一種強調簡潔和高效的編程語言,其設計模式同樣體現了這些理念。本文將探討 Go 語言中常見的幾種設計模式,包括單例模式、工廠模式、策略模式、觀察者模式,並用 UML 創建概念模型來直觀展示這些設計模式的結構。1. 單例模式單例模式確保一個類只有一個實例,並提供一個全局訪問點。在 Go 中,使用私有結構體和公有的獲取實例函數是實現 ⌘ Read more
理解並在 Golang 中實現自旋鎖**
在併發編程中,互斥鎖(Mutual Exclusion)是一種常用的同步機制,用於保護關鍵資源並防止數據競態。然而,在特定情況下,特別是當鎖的持有時間很短且線程數量有限時,一種輕量級的鎖稱爲自旋鎖(Spin Lock)可以提供更高的性能。What is a Spin Lock自旋鎖是一種忙等待鎖。當一個線程試圖獲取另一個線程持有的鎖時,它會持續地檢查鎖的狀態(自旋),直到鎖被釋放,然後它就會獲得所 ⌘ Read more
探祕 Go Playground 服務**
什麼是 Playground? Playground 是一個 Web 服務,允許任何擁有網絡瀏覽器的人編寫 Go 代碼,可以立即進行編譯、鏈接並在服務器上運行。這是給好奇的程序員一個在安裝之前嘗試 Go 語言的機會,並給有經驗的 Go 用戶一個方便的實驗場所。當然,在 Playground 上運行的程序種類有一些限制,我們不能簡單地接受任意代碼並在我們的服務器上無限制的運行它。這些程序是在一個刪 ⌘ Read more
深入 Go interface: Duck Typing 和多態**
Duck Typing鴨子類型(Duck Typing)是一種編程概念,關鍵在於根據對象的行爲來確定其類型。通常的解釋是通過一個巧妙的例子:根據對象的行爲來判斷它是否是一隻鴨子。如果它游泳像鴨子、嘎嘎叫像鴨子,那麼它就可以被認爲是一隻鴨子。動態語言如 Python 和 JavaScript 自然支持這種特性,但與靜態語言相比,動態語言缺乏重要的類型檢查。Go 語言的接口設計與鴨子類型概念密切相關, ⌘ Read more
9 個必備的 Go 語言 GitHub 庫**
使用這些不可或缺的 GitHub 庫構建健壯高效的 Go 應用程序---------------------------------在充滿活力的 Golang 開發生態系統中,GitHub 是一個寶庫,提供了許多寶貴的庫和包,這些庫和包簡化了開發工作流程,提高了生產效率,並促進了代碼重用。從 Web 框架到數據庫驅動,GitHub 倉庫託管了大量必備的 Go 庫,使開發人員能夠構建健壯且可擴展的應 ⌘ Read more
純 Go 實現的 MySQL 引擎——go-mysql-server**
go-mysql-server 是一個用 Go 編寫的 MySQL 兼容的查詢引擎。它不僅是一個解析器,還是一個服務器和查詢執行引擎,完全使用 Go 語言編寫。與 Dolt 一樣,它的目標是成爲 MySQL 的 100% 兼容的替代品。go-mysql-server 具有以下兩個主要用途:作爲 Golang 測試環境中 MySQL 的替代品,使用內置的內存數據庫實現。 通過實現一些接口, ⌘ Read more
Golang 也可以寫出很棒的 GUI 應用!**
今天聊點輕鬆的,這篇文章會分享一些用 Golang 開發的非常棒的 GUI 應用。 Pixyne第一個是 Pixyne,這是一個照片應用程序,允許你快速查看文件夾中的照片!以下是他們在 Fyne 頁面的鏈接 [1]。EasyLPAC接下來是 EasyLPAC,這個軟件能夠從電腦管理你的 eUICC 卡。這是項目在 GitHub 頁面的鏈接 [2]。Snap接下來是 Snap,這是一個跨平臺的工具 ⌘ Read more
又一個 Linux 桌面?用 Go 寫的 FyneDesk
FyneDesk 是一個易於使用的 Linux/Unix 桌面環境,遵循材料設計原則。它使用 Fyne 工具包構建,旨在易於使用和開發。我們使用 Go 語言,並歡迎任何對項目的貢獻或反饋。爲了完整的桌面體驗,您還需要安裝以下外部工具:arandr 用於修改顯示設置 xbacklight 或 brightnessctl 用於調整筆記本電腦的亮度 目前使用 connman-gtk 來配置 ⌘ Read more
Go 居然克隆了 Python 的 Requests 庫!**
在現代軟件開發中,HTTP 請求處理是一個重要環節。Grequests 是 Go 語言中一個高效的 HTTP 請求庫,靈感來源於 Python 中廣受歡迎的 Requests 庫。本文將深入講解 Grequests 庫在 Go 語言中的實現和使用,幫助開發者快速掌握其強大功能。功能概述----Grequests 庫爲 Go 開發者提供了一系列的便利功能,使得發送 HTTP 請求變得簡單高效。下面就 ⌘ Read more
Golang: 打造一個交互式命令行**
Go 非常適合於構建命令行應用程序。我們構建了一個名爲 Dolt 的應用, 它是世界上第一個支持版本控制的 SQL 數據庫。我們爲處理 Dolt 的所有子命令和參數編寫了自己的命令行解析器, 但也許我們不應該這樣做。現在有很多很棒的工具可以替代我們自己編寫的解析器, 如果我們今天開始這個項目, 我們可能會選擇使用它們:spf13/cobra 提供了從簡單的文本命令格式生成代碼的強大支持, 並且可以 ⌘ Read more
一文搞定 Golang 字符串:高效編碼的最佳實踐**
本文介紹 Golang 中處理字符串的最佳實踐,確保開發項目中實現最佳的效率、最佳性能並讓代碼更優雅。字符串可以爲 nil 嗎?如下所示,在創建字符串變量時,默認值必須是空字符串 ""。如果我們嘗試使用 nil 值初始化字符串變量,將遇到一個錯誤,提示 nil 不能在變量聲明中用作字符串值。例如:func main() {   var s string   s = nil // Cannot us ⌘ Read more
Go 實現在線用戶消息推送實戰!**
前言--今天老闆又給下了一個需求,在線用戶的消息推送,這個功能我相信 95% 的產品都有這個需求,比如下面的需求場景1: 運營給在線的用戶推送一些活動或者文案或者公告2: 實時監控和通知:在監控系統中,可以使用消息推送來實時向操作員發送系統警報和通知。例如,當系統出現異常或達到某個閾值時,服務器可以向操作員發送警報消息。3: 社交網絡和新聞資訊:使用消息推送來通知用戶有新的消息、新的粉絲或者新的內 ⌘ Read more
Go 通過 grpc-protobuf 實現高性能用戶服務實戰,從 0 到 1 超級詳細流程!!**
基礎知識準備在在代碼實戰 gRPC 之前,我們需要了解一些基礎知識:RPC(Remote Procedure Call):遠程過程調用,是一種通信協議,允許應用程序在不同的計算機上請求服務而不需要了解底層網絡細節。 gRPC:gRPC 是一種高性能、開源的遠程過程調用(RPC)框架,由 Google 開發,並基於 HTTP/2、Protocol Buffers 等技術實現。 Proto ⌘ Read more
用 Go 語言 - Redis 實現分佈式鎖,我還是第一次**
一 爲什麼需要分佈式鎖 共享資源訪問控制: 當多個節點需要同時訪問共享資源時,爲了避免併發寫入導致數據不一致,需要使用分佈式鎖確保同時只有一個節點可以寫入或修改共享資源。避免重複執行: 在分佈式系統中,某些操作可能需要在整個系統中只執行一次,比如定時任務、數據初始化等。爲了避免多個節點同時執行這些操作,需要使用分佈式鎖來確保只有一個節點可以執行。任務協調: 在分佈式任務隊列中,多個節點競爭執行任 ⌘ Read more
Go 一行代碼測量函數的執行時間**
Golang Tips 是翻譯的 Phuong Le @func25[1] 陸陸續續的發表的推文,目前已經發表 70 + 了。我徵得 Phuong Le 的同意後,會逐步把這些推翻翻譯過來,發佈到公衆號上。因爲是推文,可能原作者的內容比較簡單,比如第一個 tip 就一張圖片,我會相應的進行擴充,豐富其內容。 後續也會在 github 建立一個項目,大家都可以參與進行翻譯。我們可以通過 defe ⌘ Read more
專爲 Go 語言設計的函數式編程庫 fp-go
背景介紹在編程領域中,函數式編程是一種編程範式,它將計算視爲函數的評估,避免改變狀態和可變數據。然而,Go 語言並沒有內建對函數式編程的支持,這使得在 Go 語言中實現函數式編程變得困難。今天要給大家推薦一個 GitHub 開源項目 IBM/fp-go,該項目在 GitHub 有超過 1.1k Star,用一句話介紹該項目就是:“functional programming library for ⌘ Read more
Otter:探索 Go 語言中高效無鎖緩存庫的實現與應用**
在當今軟件開發的背景下,性能優化已經成爲了一個不可或缺的部分。尤其是在緩存技術這一塊,優秀的緩存機制不僅能大幅提高應用的響應速度,更能夠有效減輕後端系統的壓力。今天,我們要深入探究的是 Otter——這是一個針對 Go 語言設計的高性能無鎖緩存庫。接下來,我們將詳細介紹 Otter 的設計原理、特性與使用方法,並通過實例演示如何在 Go 項目中集成 Otter。Otter 緩存庫概述------- ⌘ Read more
使用 gofn 和 pipe 助力 Golang 函數式編程**
今天要介紹的是兩個在函數式編程裏面很有用的 package,通過使用 gofn[1] 和 pipe[2] 庫讓 Go 的函數式編程更強大。Go 的函數式編程由於本質上,Go 並不像 Haskell 或 Erlang 那樣是純函數式語言,但這並不意味着我們不能應用函數式編程的概念來編寫簡潔、可讀和高效的代碼。這正是 gofn 和 pipe 發揮作用的地方。gofn 和 pipegofn:一個在 Go ⌘ Read more
Go 標準庫中的一個設計敗筆:哨兵錯誤**
大家好,我是煎魚。在 Go 的歷史發展中,總是有或多或少的坑。最近遇到一個跟錯誤類型定義和聲明使用有關的小坑。翻了一圈 Go 社區裏的爭論,發現又是一個暫時無法解決的未解之坑。今天分享給大家,平時開發時也可以給自己避避坑,以免有人亂用。快速背景----在 Go 裏有一種錯誤類型的定義,官方叫做哨兵錯誤(Sentinel errors):哨兵錯誤,常用於在程序中與全局變量的值對比。可以參考最常見的 ⌘ Read more
gRPC OTel 鏈路追蹤**
Open-Telemetry 的第三方軟件包合集 包括了多個社區中常用庫的 OpenTelemetry 支持。隨着 OpenTelemetry 的不斷迭代,相信整個鏈路追蹤的生態也會越發完善。gRPC 的鏈路追蹤----------採集 gRPC 的 trace 數據,推薦使用 otelgrpc 。安裝依賴。go get go.opentelemetry.io/contrib/instrument ⌘ Read more
Go 類型安全的 Pool
池(sync.Pool)是一組可單獨保存 (Set) 和檢索 (Get) 的臨時對象集合。存儲在池中的任何項都可能在任何時候自動移除而無需通知。如果池在移除項時持有該對象的唯一引用,那麼這個對象可能會被釋放掉。池能夠確保在多個 goroutine 同時訪問時的安全性。池的目的在於緩存已分配但未使用的對象以便後續複用,減輕垃圾收集器的壓力。也就是說池的功能是爲了重用對象,目的是減輕 GC 的壓力。類 ⌘ Read more
Go HTTP 鏈路追蹤**
Open-Telemetry 的第三方軟件包合集 包括了多個社區中常用庫的 OpenTelemetry 支持。隨着 OpenTelemetry 的不斷迭代,相信整個鏈路追蹤的生態也會越發完善。基於 OTel 的 HTTP 鏈路追蹤-------------------基於 OTel 的 HTTP 客戶端和服務端鏈路追蹤實踐。客戶端實現 HTTP client 的鏈路追蹤。package maini ⌘ Read more
Golang 使用 Worker Pool 模式釋放併發性能**
我們都知道 Go 具有卓越的併發特性,Worker Pool pattern(工作池模式)是一種併發設計模式,它用於管理一組工作線程以執行任務。本文用一個例子深入講解如何使用 Worker Pool 模式提升程序的併發性能。拋出問題快速計算一個數字數組中每個數字的平方,並返回結果數組(該數組只包含從 1 到 150 的整數)。Pattern 1 : N routines for N numbers ⌘ Read more
Golang 如何動態解析 JSON
Go 以其簡潔高效而聞名,提供了強大的工具用於處理 JSON 數據。雖然基於結構體的解析很常見,但在某些情況下,JSON 結構是動態的或未知的。在本文章中,我們將探討如何使用 Go 語言中的空接口進行動態 JSON 解析,從而實現靈活性,無需預定義結構體。什麼是 Dynamic JSON Parsing動態 JSON 解析指的是能夠處理具有不同結構的 JSON 數據,適應不同模式而無需嚴格定義。在 ⌘ Read more
使用 Golang 構建你的 LLM API
大語言模型,像 ChatGPT, Llama 等已經席捲全球,從上圖的數據可以看出,ChatGPT 花了 5 天時間就達到了 100 萬用戶。而 Netflix 則花了近 4 年的時間。本文將使用 Gin 和 Langchain 教你快速構建一套 LLM API。GinGin[1] 是一個用於使用 GoLang 構建 API 的現代、快速的 Web 框架。它被設計爲易於使用、高效且性能出色,利用了 ⌘ Read more
一文掌握 Golang Empty Struct 的所有用法**
在 Go 語言中,空結構體被用作佔位符,當我們想要創建一個不攜帶任何數據的類型時。這個概念經常被用來表示特定的行爲,或者將該類型用作類似集合的數據結構。下面是個使用空結構體的例子:package mainimport ( "fmt" "unsafe")// EmptyStruct is an empty struct typetype EmptyStruct struct{}func main() ⌘ Read more