Golang 發起 http 請求:GET 帶參數、POST 發送 Form 和 JSON 數據
1、發起 GET 請求———–使用net/http 可以很容易發起 get 請求package mainimport ( ”fmt” ”io” ”net/http”)func main() { resp, := http.Get(”https://httpbin.org/get”) defer resp.Body.Close() body, : ⌘ Read more
go-cache: 採用 Cache-Aside 模式的多層 Go 緩存
在現代的應用程序開發中,緩存是提高性能和擴展性的關鍵技術之一。在 Go 語言的生態系統中,有許多優秀的緩存庫,其中之一便是go-cache。本文將詳細介紹go-cache庫及其使用方法,旨在幫助開發者更好地利用緩存提高應用程序的性能。什麼是 go-cache?————-go-cache是一個靈活的多層緩存庫,設計用於處理內存緩存和共享緩存。它採用了 Cache-Aside(旁路緩存 ⌘ Read more
如何架構優秀的 Go 後端 REST API 服務
REST(Representational State Transfer)是 Web 服務中廣泛使用的一種架構風格,其核心思想是使用 HTTP 協議出色地創建、讀取、更新和刪除(CRUD)資源。作爲一種靜態類型、編譯型語言,Go 在構建高效、可靠的 Web 服務時具有顯著優勢。使用 Go 語言構建 REST API 服務需要我們從多個方面入手,包括項目結構、框架選擇、數據庫操作、路由設計等。以下將 ⌘ Read more
Go 使用 interface 時的 7 個常見錯誤
寫在正文之前閱讀本文之前我們來先熟悉以下的代碼原則,如果你已經很熟悉這些內容,可以直接跳到正文。接口隔離原則:絕不能強迫客戶實現其不使用的接口,也不能強迫客戶依賴其不使用的方法。 多態性:代碼變化會根據接收到的具體數據改變其行爲。 里氏替換原則:如果你的代碼依賴於一個抽象概念,那麼一個實現可以被另一個實現所替代,而無需更改你的代碼。 抽象的目的不是爲了含糊不清,而是爲了創造一 ⌘ Read more
萬字長文:Go 語言流行 ORM 框架 GORM 使用詳解
GORM 是 Go 語言中最受歡迎的 ORM 庫之一,它提供了強大的功能和簡潔的 API,讓數據庫操作變得更加簡單和易維護。本文將詳細介紹 GORM 的常見用法,包括數據庫連接、模型定義、CRUD、事務管理等方面,幫助大家快速上手使用 GORM 進行 Web 後端開發。安裝通過如下命令安裝 GORM:$ go get -u gorm.io/gorm你也許見過使用 go get -u github. ⌘ Read more
NeoVim 打造成跟 Goland 一樣好用的 IDE
在軟件開發領域,集成開發環境(IDE)的選擇對程序員的效率和生產力起着舉足輕重的作用。對於尋求精簡而強大的編碼體驗的 Golang 開發者來說,配置 Neovim 是一個不錯的選擇。本文分享完整的 Golang NeoVim 的設置,幫助你將 NeoVim 打造成媲美 Goland 的開發環境。初始設置將以下內容添加到 .vimrc 或 init.vim 文件中。set expandtabset ⌘ Read more
Go 1-22 提供的更加強大的 Tracing 能力
本文是由 Go Team 的 Michael Knyszek 在 2024 年 3 月 14 日發表於 go official blog,原文地址:https://go.dev/blog/execution-traces-2024runtime/trace packageruntime/trace[1] package 包含了理解並排查 Go 程序的強大工具。其功能可以生成每個 gorouti ⌘ Read more
Go 設計模式:責任鏈和函數選項,讓你的代碼更優雅!
最近接觸到越來越多有歷史 “沉澱” 的 Go 項目,深感設計模式和及時干預的重要性。近期會分享一些設計模式,一起學習代碼設計!今天的分享的設計模式是:責任鏈和函數選項模式。在日常程序裏是比較常用的。很多開源庫中也有使用。責任鏈模式—–責任鏈模式(Chain of Responsibility Pattern)是一種行爲設計模式,它允許對象將請求沿處理程序鏈進行傳遞。程序鏈既可以處理請求,也可 ⌘ Read more
Golang Context 內部原理一覽
context[1] 包是每個 Go 語言程序員在編程生涯中都會使用到的, 但你們真的瞭解它的內部工作原理嗎 (因爲據說真正的美麗都藏在內在)? 如果你對此感興趣, 可以查看我之前關於 sync.WaitGroup 內部工作原理的博文 鏈接 [2] 。本文旨在簡要概覽內部工作原理, 因此我會適當簡化一些細節。如果你想查看全部的實現細節, 或者你更喜歡直接閱讀源代碼而不是博客, 可以 點擊這裏 ⌘ Read more
go 語言調用 shell 命令有這麼兩種方式,都用過了?
阻塞方式 (需要執行結果) 主要用於執行shell命令,並且返回shell的標準輸出適用於執行普通非阻塞 shell 命令,且需要 shell 標準輸出的//阻塞式的執行外部shell命令的函數,等待執行完畢並返回標準輸出func execshell(s string) (string, error){ //函數返回一個Cmd,用於使用給出的參數執行name指定的程序 cmd := ⌘ Read more
10 個提高生產力的 Go 小技巧
最近 Phuong Le 大佬針對日常開發 Go 項目時,總結了一些好用的 Go 小技巧。看了後,感覺對於剛入門 Go 的同學有一定的學習價值。可以挑好的學。應用到自己項目裏。以下內容分享給大家。在開發 Go 生產項目時,我發現自己經常重複編寫代碼和使用某些技術,直到後來回顧自己的工作時才意識到這一點。下面是從總結經驗中挑選的一些有用的代碼片段,希望對大家有所幫助。計時技巧——-如果你對跟 ⌘ Read more
PocketBase:一體化的開源 Go 語言實時後端
PocketBase 是一個開源的實時後端解決方案,採用單一文件的形式進行分發。它由嵌入式數據庫 (SQLite) 和實時訂閱功能組成,提供了開箱即用的文件和用戶管理功能、方便的管理儀表板 UI 以及簡單的 REST 風格 API。本文將深入探討 PocketBase 的功能、安裝、示例代碼和一些高級的應用技巧。主要特性—-嵌入式數據庫PocketBase 內嵌 SQLite 數據庫,這意味着 ⌘ Read more
Go: 使用依賴注入實現 Gin 框架路由處理函數的解耦
在 Go 語言開發中,Gin 是一個非常流行的 Web 框架。其輕量級、高性能的特點,使其成爲許多開發者的首選。然而,在實際項目中,隨着業務邏輯的複雜化,我們往往會遇到代碼耦合嚴重、測試困難等問題。依賴注入(Dependency Injection, DI)是一種有效的解耦手段,能夠幫助我們實現代碼的高內聚、低耦合,從而提升代碼的可維護性和可測試性。本文將探討如何在 Gin 框架中使用依賴注入來解 ⌘ Read more
Go:執行跟蹤變得更加強大
簡介Go 語言的 runtime/trace 包含一個強大的工具,用於理解和排查 Go 程序。其中的功能允許跟蹤每個 goroutine 在一段時間內的執行情況。然後,使用 go tool trace 命令(或優秀的開源工具 gotraceui)可以可視化和探索這些跟蹤中的數據。跟蹤的魔力在於,它可以輕鬆地揭示程序中其他方式難以看到的東西。例如,在 CPU 概要文件中很難看到併發瓶頸,因爲沒有要採 ⌘ Read more
Go singlefight 源碼詳解
寫在前面 通俗的來說就是 singleflight 將相同的併發請求合併成一個請求,進而減少對下層服務的壓力,通常用於解決緩存擊穿的問題。詳解基礎結構—-golang.org/x/sync/singleflight singleflight 結構體:type call struct { wg sync.WaitGroup // 這些字段在 WaitGroup 結束前寫入一次 // 只有在 W ⌘ Read more
Go:標準庫 bufio 包詳解
引言在日常開發中,對文件或輸入輸出流進行讀寫操作是非常常見的任務。Go 語言標準庫中的bufio包提供了數據的緩衝讀寫功能,使得讀寫操作更加高效。本文將詳細介紹bufio包的主要功能及其在實際編程中的應用場景。bufio 包概述bufio包主要提供了緩衝讀寫的能力,通過包裝一個io.Reader或io.Writer對象,創建一個帶緩衝的(buffered)讀寫器。使用緩衝可以減少對底層 IO 資源 ⌘ Read more
使用 Golang 開發 eBPF 的應用
大多數時候, 我們在開發軟件或使用軟件時, 都在操作系統的安全邊界內運行。我們甚至不知道 IP 數據包是如何從網絡接口被接收的, 或者當我們保存文件時, inode 是如何被文件系統處理的。這個邊界被稱爲用戶空間, 我們在這裏編寫應用程序、庫和工具。但還有另一個世界, 即內核空間。操作系統內核就駐留在這裏, 負責管理系統資源, 如內存、CPU 和 I/O 設備。通常我們不需要深入到 socket ⌘ Read more
在 Go 中如何讓結構體不可比較?
最近我在使用 Go 官方出品的結構化日誌包 slog 時,看到 slog.Value 源碼中有一個比較好玩的小 Tips,可以限制兩個結構體之間的相等性比較,本文就來跟大家分享下。在 Go 中結構體可以比較嗎?在 Go 中結構體可以比較嗎?這其實是我曾經面試過的一個問題,我們來做一個實驗:定義如下結構體:type Normal struct { a string B int}使用這個結構體分別聲明 ⌘ Read more
Go 實現可複用的通用內存緩存
本文介紹瞭如何在 Go 語言中創建一個可重用的內存通用緩存,並提供了具體的實現代碼和使用示例。Prerequisites安裝 Go go-cache package[1] 實現首先,創建一個 cache package,它包含我們正在構建的緩存的代碼。package cacheimport ( ”time” ”github.com/patrickmn/go-cache”)使用泛型實現一 ⌘ Read more
Go:log 庫的全面指南與使用技巧
引言–在 Go 語言的標準庫中,log包提供了簡單而強大的日誌功能。日誌記錄是軟件開發中不可或缺的一部分,它不僅幫助開發人員調試和排查問題,還在系統運行中提供了寶貴的運行時信息。本文將詳細講解 Go 語言log庫的各種功能及其使用技巧,幫助開發者更好地掌握和應用這一重要工具。log 包簡介——-log包是 Go 語言標準庫的一部分,提供了基本的日誌記錄功能。它支持日誌消息的格式化、日誌輸 ⌘ Read more
Go 實現雙 buffer id 生成器
本文通過 Go 實現一個 Leaf——美團點評分佈式 ID 生成系統 雙 buffer 的 id 獲取器。一. 主流程———-主流程看圖似乎步驟非常多,但實際上總結起來就以下三個步驟:客戶端發起請求 id 獲取器從緩存中獲取 如果 id 已經被消耗超過閾值,則重新加載新的號段到內存中 接下來我們來具體看一下 Go 代碼是如何實現的二. 代碼實現——-2.1 S ⌘ Read more
Go:For-Select-Done 併發設計模式應用
引言Go 語言支持的併發模型是其一大亮點,它內建的 Goroutine 機制爲構建高性能併發應用提供了基礎。在這種環境下,使用 For-Select-Done 設計模式可以優雅地處理併發任務和通道(Channel)的交互,從而實現高效的數據處理和狀態管理。For-Select-Done 設計模式概述For-Select-Done 模式是一種結構化的方式來處理 Go 中的多個通道讀寫操作,使代碼更加 ⌘ Read more
10 分鐘瞭解 Golang 泛型
泛型是 Golang 在 1.18 版本引入的強大工具,能夠幫助我們在合適的場合實現簡潔、可讀、可維護的代碼。原文: Go Generics: Everything You Need To Know[1]導言可能有人會覺得 Go 泛型很難,因此想要借鑑其他語言(比如 Java、NodeJS)的泛型實踐。事實上 Go 泛型很容易學,本文希望能幫助讀者更好的理解 Go 泛型。 👉注:本文不會將 ⌘ Read more
cassowary: 現代跨平臺的 Go 語言 HTTP 負載測試工具
在現代互聯網應用程序中,性能和響應速度是決定用戶體驗的關鍵因素。負載測試是確保我們的應用程序在高併發下仍能穩定運行的一種重要手段。本文將帶你瞭解一個現代的跨平臺 HTTP 負載測試工具——cassowary,並展示其安裝和使用方法。什麼是 cassowary?————–cassowary 是一個用 Go 語言編寫的現代跨平臺 HTTP 負載測試工具。它設計簡潔、易於使用,支持高併 ⌘ Read more
在 Go 中如何優雅的使用 wire 依賴注入工具提高開發效率?上篇
如果你做過 Java 開發,那麼想必一定聽說或使用過依賴注入。依賴注入是一種軟件設計模式,它允許將組件的依賴項外部化,從而使組件本身更加模塊化和可測試。在 Java 中,依賴注入廣泛應用於各種框架中,幫助開發者解耦代碼和提高應用的靈活性。本文就來介紹下什麼是依賴注入,以及在 Go 語言中如何實踐依賴注入,提高 Go 項目的開發效率和可維護性。什麼是依賴注入?正如前文所述,依賴注入(dependen ⌘ Read more
Go: 深入探究 uintptr 類型
Go 語言作爲一種靜態類型、編譯型語言,其獨特的類型系統爲編程提供了強大的支持。在衆多類型中,uintptr 是一個較爲特殊的類型,它用於存儲指針值的整數表示。本文將詳細介紹 uintptr 的概念、使用場景及其與普通指針類型的區別。uintptr 的定義與特性在 Go 語言中,uintptr 是一個無符號整數類型,其大小足以存儲任意指針的位模式。具體來說,uintptr 的定義如下:type u ⌘ Read more
Go 事件驅動編程:實現一個簡單的事件總線
前言在當今微服務和分佈式系統盛行的背景下,事件驅動架構(Event-Driven Architecture,EDA)扮演着一個至關重要的角色,此架構的設計使得服務間可以通過事件進行同步或異步通信,替代了傳統的直接接口調用。基於事件的交互方式,促進了服務之間的松耦合,提高系統的可擴展性。發佈 - 訂閱模式是實現事件驅動架構的模式之一,它允許系統的不同組件或服務發佈事件,而其他組件或服務可以訂閱這些事 ⌘ Read more
yq:基於 Go 實現處理 YAML、JSON、XML、CSV、TOML 的命令行工具
在現代開發和運維的世界中,處理和轉換不同格式的數據文件如 YAML、JSON、XML、CSV 等是日常任務。文件格式的多樣性和複雜性常常給開發者帶來不小的挑戰。在這種情況下,強大的命令行工具能夠極大地簡化工作流程。本文將深入探討一個強大的多功能工具——go yq,它能夠便捷地處理 YAML、JSON、XML、CSV、TOML 以及屬性文件。安裝 go yq——–首先,我們需要安裝 go ⌘ Read more
GO 語言學習筆記: 垃圾回收機制剖析
一、引言—-(一)垃圾回收 概述垃圾回收(Garbage Collection,GC) 是 Go 語言的核心特性之一,是實現內存自動管理的一種形式。golang 的自動垃圾回收屏蔽了複雜且容易出錯的內存操作,讓開發變得更加簡單、高效。在 Go 語言中,從實現機制上來說,垃圾回收可能是最複雜的模塊了。瞭解垃圾回收的機制,有助於更好地理解 Go 語言的內存管理機制,從而更好的使用 Go 語言進行開 ⌘ Read more
Go 命令模式實戰
隨着分佈式應用越來越廣泛,數據操作的一致性需要由業務方來保證,兩個操作不在同一個事務操作失敗時,無法依靠數據庫事務直接回滾,這時需要業務方手動進行回滾。通過命令模式提供新舊數據初始化後,如果執行後有後續操作失敗,業務方可以通過調用 Undo方法進行回滾,無需再編寫數據庫操作代碼優點是減少了回滾代碼的重複編寫,只要提供新舊數據,通過 Do和 UnDo就可以完成對應操作。並且有些時候可能 Undo 方 ⌘ Read more
使用 Golang 構建你的第一個 k8s Operator
本文將展示如何使用 Operator SDK[1] 搭建一個基本的 k8s Operator。在本文中,您將瞭解如何創建一個新項目,並通過創建自定義資源定義 (CRD) 和基本控制器來添加 API。我們將在 CRD 中添加字段,以包含一些有關期望狀態和實際狀態的信息,修改控制器以調和新資源的實例,然後將 operator 部署到 Kubernetes 集羣。Prerequisites安裝 Oper ⌘ Read more
Go 中空結構體的用法,我幫你總結全了!
在 Go 語言中,空結構體 struct{} 是一個非常特殊的類型,它不包含任何字段並且不佔用任何內存空間。雖然聽起來似乎沒什麼用,但空結構體在 Go 編程中實際上有着廣泛的應用。本文將詳細探討空結構體的幾種典型用法,並解釋爲何它們在特定場景下非常有用。空結構體不佔用內存空間首先我們來驗證下空結構體是否佔用內存空間:type Empty struct{}var s1 struct{}s2 := E ⌘ Read more
快速喫透 Golang Channels 使用技巧
Golang 可以通過啓動 goroutines 來併發執行任務。它們可以通過一種名爲 “通道” 的通信媒介相互通信。話不多說,下面我列舉了幾種不同情況下 channel 的使用以及其適用條件,最後總結出一張 channel table,能夠幫助你快速喫透 channel 的所有要點。Let’t go!Nil Channels如果你像創建普通變量一樣創建一個通道,通道將被初始化爲零值。這裏要提到的 ⌘ Read more
如何將圖片編碼成 base64?
圖片的 base64 編碼在多種上下文中都很有用。當需要通過旨在處理文本數據的媒體存儲或傳輸圖片時,它通常會被使用,比如嵌入到網頁或者通過 API 上傳圖片。這篇文章將介紹如何使用 Go 標準庫得到任何圖片的 base64 編碼的值。在 Go 中將圖片轉換爲其 base64 表示很容易。所有你需要做的是將文件讀取爲字節 slice 並使用包 encoding/base64 對其進行編碼。處理本地圖 ⌘ Read more
Go:深入理解互斥鎖,實現與應用
在併發編程中,互斥鎖是一種基本的同步機制,用於保護共享資源不被多個線程或進程同時訪問,從而避免數據競爭和保證數據的一致性。本文將深入探討互斥鎖的概念、工作原理,並通過 Go 語言的具體實現來展示互斥鎖在實際編程中的應用。互斥鎖的基本概念互斥鎖(Mutex)是最簡單的一種鎖形式,它僅允許一個線程在同一時刻訪問某個資源。當一段代碼被定義爲臨界區時,任何線程在進入該區域前必須先獲得互斥鎖的授權,並在離開 ⌘ Read more
利用 Go 語言加速 Redis 操作:掌握 go-redis 包的高效應用技巧
一、golang 操作 redis 1、安裝初始化文件夾 c:\aaa mkdir testredisc:\aaa\testredis go mod init testredis安裝 go get github.com/go-redis/redis/v82、基本使用 package mainimport ( “context” “fmt” “github.com/go-r ⌘ Read more
Go:標準庫 Arena 的內存管理優化解析
引言–在 Go 語言的衆多標準庫中,arena庫是一個相對較新且不爲人知的部分,還處於試驗階段。這個庫提供了一種管理內存分配的有效方式,尤其適用於處理大量小型對象,能夠顯著減少內存碎片和提高內存使用效率。本文將深入探討arena庫的設計理念、使用方法以及它如何優化 Go 語言程序的內存管理。arena庫概述———-arena庫的核心思想是提供一個連續的內存塊,讓開發者可以在其中快速分 ⌘ Read more
Go:雙向鏈表實現,container-list 包探討
引言在 Go 語言的標準庫中,container/list包提供了雙向鏈表的實現。鏈表是一種常見的數據結構,它通過節點的序列實現,每個節點都包含數據及對前一個節點和後一個節點的引用。Go 語言的container/list包提供了操作鏈表的多種方法,如插入、刪除、搜索和移動元素等。本文將深入探討container/list包,解析其實現的內部機制,並通過示例展示如何在 Go 程序中有效地使用此包。 ⌘ Read more
基於 Go 語言實現的 Ollama 大語言模型框架
大語言模型在現代人工智能領域中扮演着重要角色。Ollama 作爲一個輕量級且可擴展的框架,幫助開發者在本地機器上構建和運行這些模型。Ollama 簡介———Ollama 是一個簡單、可擴展的框架,旨在幫助開發者構建和運行大語言模型。它提供了一個簡潔的 API,用於創建、運行和管理模型。此外,Ollama 附帶了豐富的預構建模型庫,供開發者在各種應用中輕鬆使用。Ollama 的特性包括: ⌘ Read more
如何優雅地處理 Goroutines 中的錯誤?
在使用 goroutines 的時候,你肯定遇到過需要處理不同 goroutine 裏面的錯誤的情況,這裏跟大家分享幾點經驗之談,也歡迎大家討論。❌ 在 Waitgroup 中處理有些開發者可能會使用下面的方式:package mainimport ( ”errors” ”sync” ”time”)func main() { var wg sync.WaitGroup wg.Add(3) var ⌘ Read more
Go 項目中的 Goroutine 泄露及其防範措施
Goroutine 是 Go 語言中實現併發的重要機制。它們輕量且高效,極大地提升了 Go 程序的併發能力。然而,在實際編程中,我們容易遇到 Goroutine 泄露的問題。這篇文章將詳細探討 Goroutine 泄露的概念、原因、檢測方法及其防範措施。什麼是 Goroutine 泄露?—————–Goroutine 泄露類似於內存泄露,是指程序中創建的 Goroutine ⌘ Read more
Kubernetes Go 週期執行器的實現
週期執行器主要用在同步網絡規則,如 iptables proixer、nettables proixer 中,一旦有新的網絡規則需要增加,就會週期性執行。我們通過一張圖來快速瞭解一下 BoundedFrequencyRunner 的執行流程BoundedFrequencyRunner用於週期性的執行同步方法,並且提供了執行失敗進行重試,內部封裝了運行的限流器type BoundedFrequenc ⌘ Read more
使用 Go 語言實現定時任務:輕鬆掌握 Cron 表達式
一、cron 基本使用1、使用舉例package mainimport ( “fmt” “github.com/robfig/cron”)//主函數func main() { cron2 := cron.New() //創建一個cron實例 //執行定時任務(每5秒執行一次) err:= cron2.AddFunc(“/5 “, print5) if err!=nil{ ⌘ Read more
Go:泛型全面解析,從基礎到實際應用
引言Go 語言在其 1.18 版本中引入了泛型功能,這是一個具有里程碑意義的更新。此前,Go 開發者常常藉助接口、反射等方法間接實現泛型的需求,這既複雜又影響性能。泛型的引入使得代碼不僅更加靈活,同時也更加高效和類型安全。本文通過解析一段 Go 語言的泛型示例代碼,詳細講解泛型的特性及其在 Go 中的實際應用。Go 語言泛型特性詳解基本語法和定義泛型,或者說參數化類型,是一種在編程時不具體指定其數 ⌘ Read more
用 go 語言實現一個有界協程池
寫在文章開頭——本篇文章算是對go語言系列的一個收尾,通過 go 語言實現一個實現一個簡單的有界協程池。Hi,我是 sharkChili ,是個不斷在硬核技術上作死的 java coder ,是 CSDN 的博客專家 ,也是開源項目 Java Guide 的維護者之一,熟悉 Java 也會一點 Go ,偶爾也會在 C 源碼 邊緣徘徊。寫過很多有意思的技術博客,也還在研究並輸出技術的路上,希 ⌘ Read more
全面解析 Go 語言 Channel:面試必備知識點
一、channel 的整體結構圖1、channel 結構圖 channel 本質是一個 hchan 這個結構體 type hchan struct { buf unsafe.Pointer // points to an array of dataqsiz elements sendx uint // send index recvx uint ⌘ Read more
Go 實驗室:image 圖像處理就用它
短腿子猿的 Go 實驗室,Golang 官方提供了很多 package 來幫助大家提高開發的效率,但是由於函數太多,經常會記不住,這裏開了一個專題來分享官方 package,努力做到每週一更 Golang 中的 image 包提供了基本的圖像類型、顏色模型、以及用於處理圖像的各種函數和接口。以下是一些常用的函數和接口,以及相應的示例。常用類型與接口——-image.Image 接口這是 ⌘ Read more
Go 併發編程精粹:掌握通道(channels)的藝術
在併發編程的多任務世界中,Go 語言以其強大的併發特性而獨樹一幟。通道(channels),作爲 Go 併發模型中的核心概念,是連接不同 goroutines 的橋樑,確保了數據在它們之間的流暢傳遞。如果你對 goroutines 已經有所瞭解,那麼現在是深入探索通道的絕佳時機。併發編程:Go 語言的殺手鐧————–併發性是現代編程中的關鍵特性,它允許程序在同一時間內執行多個任務 ⌘ Read more
Golang 插件系統實現
插件可以在解耦的基礎上靈活擴展應用功能,本文介紹瞭如何基於 Golang 標準庫實現插件功能,幫助我們構建更靈活可擴展的應用。原文: Plugins with Go[1]什麼是插件簡單來說,插件就是可以被其他軟件加載的軟件,通常用於擴展應用程序的功能和外觀,插件的開發人員甚至可以不直接修改基礎應用程序。你很可能在日常生活中使用過插件,也許用的是其他名稱,如擴展 (extensions) 或附加 ⌘ Read more
掌握 Go 語言 Interface:面試高頻考點詳解
一、interface1、interface 作用接口是 Go 語言的重要組成部分,它在 Go 語言中通過一組方法指定了一個對象的行爲 接口 interface 的引入能夠讓我們在 Go 語言更好地組織並寫出易於測試的代碼 golang 中的接口分爲帶方法的接口和空接口 iface: 表示帶方法的接口 eface:表示空接口 2、eface 空接口 空接口 efac ⌘ Read more
Go 語言主流 ORM 框架對比:GORM vs- Ent
GORM 和 Ent 是 Go 語言中使用廣泛的兩種 ORM(對象關係映射)框架。它們都有助於將數據庫操作從底層 SQL 抽象出來,簡化數據庫交互,但它們的設計理念和使用方式有顯著的不同。本文將詳細介紹 GORM 和 Ent 的不同特點、使用示例,並比較它們在不同場景下的優劣。GORM 簡介——-GORM 是一個易於使用的 ORM 庫,旨在提供簡單、乾淨的 API。它通過反射機制動態處理數 ⌘ Read more
GRequests: 讓 HTTP 服務人類
熟悉我的讀者朋友們都知道,我早期是寫 Python 的,現在主力語言是 Go。開始接觸 Go 語言以後,我發現 Go 自帶的 net/http 請求庫不夠好用,好在我沒用 Go 寫過一行爬蟲代碼,平時 net/http 庫用的也就比較少,不是每天都用,也就忍了。最近我在網上衝浪時,無意間發現了 grequests 這個庫,靈感來源於 Python 生態中大名鼎鼎的 requests 庫。顧名思義, ⌘ Read more
命令分發模式
命令分發模式 (command dispatcher pattern) 不屬於 23 種經典的設計模式。它是一種不太爲人所知的設計模式, 它主要用於構建可擴展、可插拔的系統架構, 將請求與執行請求的操作對象解耦。它類似於命令模式 (Command Pattern), 但更加靈活和動態。雖然 Command Dispatch Pattern 不屬於那 23 種經典模式, 但它確實是一種很有價值的模式 ⌘ Read more
實現微服務註冊的高效利器:gRPC 與 Nacos 集成教程
一、golang gRPC 註冊 nacosgithub 地址 nacos-sdk-go(opens new window) nacos 官網 1、目錄結構 2、pb/person.protosyntax = “proto3”;option gopackage = “./person”;package pb;message Person { string name = 1; in ⌘ Read more
全面掌握 GORM 中的遷移系統,實現自動遷移與手動遷移
在 Golang 生態系統中,GORM 作爲一個廣泛使用的 ORM 框架,不僅在數據庫操作方面提供了友好的 API 支持,其遷移系統(Migration System)同樣功能強大且易於使用。在本文中,我們將詳細解析 GORM 中的遷移機制,包括自動遷移和手動遷移,同時提供詳盡的代碼示例,幫助開發者全面掌握這一技術。什麼是數據庫遷移?———在數據庫系統中,遷移是指對數據庫架構進行變更的 ⌘ Read more
使用 Go Channel 構建可擴展的併發 worker pool
在本篇博文中,我們將深入探討如何在 Go 中構建一個可擴展的 Worker pool。該實現可有效地管理 Worker pool,以處理大量請求,同時根據負載動態調整 Worker 的數量。我們還會討論可能出現的問題以及如何避免它們。概覽要實現的 worker pool 應該具有以下功能:根據負載情況動態調整 worker 數量; 具備超時和重試機制處理接收到的請求; 能夠 Grace ⌘ Read more
快速生成 Go 語言數據庫模型:探索 GORM gen 的便捷神器
官方文檔:https://gorm.io/zhCN/gen/create.html 一、安裝 mysql 1、安裝 mysql拉取 MySQL 鏡像docker pull mysql運行 MySQL 容器docker run –name mysql-server -p 3306:3306 -e MYSQLROOTPASSWORD=123456 -d mysql安裝mysql客戶端brew ⌘ Read more
Go 實現的一個 bitset,設計思想非常棒,值得參考收藏!
這兩日讀了一個實現二維碼生成的庫。其中的 bitset 設計得非常好,就摘抄記錄下來,與大家一起分享。bitset 實現一個可擴展的 bit 集合,可以添加 bit 和查看 bit。它在二維碼生成中,用來將編碼後的內容協助生成位圖,然後通過位圖進行繪製二維碼。二維碼的黑白格子正好用二進制 0 和 1 來表示。 下面開始詳細講解這個功能設計: 一、我們使用一個結構體來存儲 bit 序列。Bits ⌘ Read more
Go 語言學習筆記:深入理解匿名函數與閉包
一、引言—-在 Go 語言中,匿名函數與閉包是兩個重要的概念,它們增強了 Go 語言的表達力和功能性,使得代碼更加簡潔和強大。 本文將深入探討 Go 語言中的匿名函數與閉包,幫助讀者更好地理解和應用這兩個概念。匿名函數在 Go 語言中提供了一種靈活的方式來定義即用即拋的函數邏輯,減少了命名負擔並且可以直接在代碼中嵌入。閉包則允許匿名函數捕獲並持有其定義時作用域中的變量,使得函數具有狀態,這對於 ⌘ Read more
Go 線程同步
線程同步—-通常在 Go 語言中有兩種方法可以用來做線程同步sync.Cond channel channel 的很好理解,當我們從一個 channel 中接收數據的時候,如果裏面沒有數據,那我們直接就阻塞在那裏了;在這篇文章中就來看看怎麼使用 sync.Cond 完成同步sync.Cond———「定義結構體和方法」type BlueberryInt struct { ⌘ Read more
Golang 中 JSON 操作的 5 個常見陷阱(建議收藏!)
JSON 是許多開發人員在工作中經常使用的一種數據格式。它一般用於配置文件或網絡數據傳輸等場景。由於其簡單、易懂、可讀性好,JSON 已成爲整個 IT 界最常用的格式之一。對於這種情況,Golang 和許多其他語言一樣,也提供了標準庫級別的支持, encoding/json[1]。就像 JSON 本身很容易理解一樣,用於操作 JSON 的編碼 / JSON 庫也非常容易使用。但我相信,很多開發者可 ⌘ Read more
使用 Go 語言的 bytes 包高效地操作字符串
在編程語言 Go 中,bytes包提供了一系列用於操作[]byte類型的函數,這非常有用,特別是當你需要處理大量的字符串和切片時。通過使用bytes.Buffer,你可以高效地構建和修改字符串,而不必擔心頻繁的內存分配和字符串拼接導致的性能問題。下面,我們將深入瞭解如何使用bytes.Buffer,並通過豐富的示例演示它的強大功能。Buffer 的基本用法————bytes.Buf ⌘ Read more
Golang 實現搜索引擎
概述–主要包括三個部分:網絡爬蟲: 爬取儘可能多的網頁; 網頁分詞: 利用jieba庫對網頁內容進行分詞, 並存儲分詞結果(格式爲: 文檔 id, 文檔長度, 詞頻, 分詞偏移 - 文檔 id, 文檔長度, 詞頻, 分詞偏移); 搜索頁面: 提供一個前端頁面, 用戶輸入搜索詞, 基於分詞相關性, 返回結果; 不要害怕,整個邏輯很簡單,邏輯拆分的很獨立,便於理解。項目地址: ht ⌘ Read more
Golang 狀態機設計模式
本文介紹了 Golang 狀態機模式的一個實現示例,通過該模式,可以解耦調用鏈,有助於實現測試友好的代碼,提高代碼質量。原文: Go State Machine Patterns[1]導言在我們開發的許多項目中,都需要依賴某種運行狀態從而實現連續操作。這方面的例子包括:解析配置語言、編程語言等 在系統、路由器、集羣上執行操作… ETL(Extract Transform Loa ⌘ Read more
Go 語言中,HTTP 請求流式是如何寫入 body 的?
最近在開發一個功能時,需要通過 http 協議上報大量的日誌內容,但是在 Go 標準庫裏的 http client 的 API 是這樣的: http.NewRequest(method, url string, body io.Reader)body 是通過 io.Reader 接口來傳遞,並沒有暴露一個 io.Writer 接口來提供寫入的辦法,先來看看正常情況下怎麼寫入一個 body ,示例 ⌘ Read more
Go 項目文件命名規範是什麼?
計算機科學中只有兩件難事:緩存失效和命名。—— 菲爾 · 卡爾頓(Phil Karlton)。在編程世界中,選擇正確的命名約定是打開可讀和可維護代碼大門的重要途徑。在使用 Go 語言開發大型項目時,文件命名是構建清晰項目結構的關鍵一環,一個合理的文件命名規範不僅能提高開發效率,還能降低團隊協作中的溝通成本。在這篇博文中,我們將深入探討 Go 中命名的最佳實踐。在探討 Go 文件命名規範之前,我 ⌘ Read more
Google 官方發佈 Go 語言編碼規範
在現代軟件開發中,代碼的可讀性和一致性是至關重要的。尤其是當團隊規模擴大時,遵循一致的編碼規範可以顯著提高代碼的可維護性和團隊協作效率。本文將深入探討 Go 語言的 Google 編碼規範,並結合具體示例,幫助你在實際開發中應用這些規範。爲什麼需要編碼規範?———-編碼規範不僅僅是 “如何寫代碼” 的指導方針,它更是團隊協作的基石。遵守編碼規範可以:提高代碼的可讀性:一致的代碼風格使得 ⌘ Read more
在 Golang 中不要簡單的返回 err
相反, 添加相關的調試細節。有些人喜歡抱怨 Go 需要編寫大量的 “ iferr!=nil{returnerr}” 代碼塊。這些人並沒有真正理解 Go 的錯誤處理機制。實際上, 他們抱怨的正是處理 Go 錯誤的完全錯誤方式: returnerr是一種反模式。讓我通過一些示例代碼來解釋我的意思: 一個用於配置 mTLS[1] 連接的輔助庫。(“雙向 TLS” 是向服務器證明客戶端身份的一種方式。)p ⌘ Read more
[譯]Go 中的循環依賴:如何解決這個問題
作爲一個 Golang 開發,你可能在項目中遇到過包的循環依賴問題。Golang 不允許循環依賴,如果檢測到代碼中存在這種情況,在編譯時就會拋出異常。本文會討論循環依賴是如何發生的以及如何處理。循環依賴假設我們有兩個包:p1 和 p2。當包 p1 依賴包 p2,包 p2 依賴包 p1 時,就會產生循環依賴。真實情況可能會更復雜一些。例如,包 p2 不直接依賴包 p1 而是依賴於包 p3,而 p3 ⌘ Read more
一致性哈希的基本概念及其 Golang 實現
在大規模分佈式系統的世界中,高效地管理和分配數據是一個關鍵挑戰。一種廣泛使用的技術是一致性哈希。這種方法確保數據在多個服務器之間均勻分佈,即使服務器的數量隨時間變化也是如此。本文將探討水平擴展、簡單哈希和一致性哈希的概念,並提供一個 Go 語言的示例實現。水平擴展在分佈式系統中,數據通常無法容納在單個服務器上。爲了處理大規模數據,數據被分佈在多臺機器上,這個過程稱爲水平擴展或分片。爲了確保可預測的 ⌘ Read more
探索 Go 語言數據庫查詢的終極指南:深入解析 GORM 的強大查詢功能
一、GORM 基本查詢1、基本查詢func (c UserController) UserSelect() { //1、查詢id=3的用戶 user := models.User{Id: 3} models.DB.Find(&user) //2、查詢所有數據 user := []models.User{} result := models.DB.Find(&user) //5 (統計 ⌘ Read more
深入理解 Go 語言 Gin 框架的請求處理機制
一、獲取 GET 請求 1、URL?參數 http://127.0.0.1:8080/user/search?username=snail&address=sh package mainimport ( “github.com/gin-gonic/gin” “net/http”)func main() { //Default返回一個默認的路由引擎 r := gin.Default ⌘ Read more
C 語言竟可以調用 Go 語言函數,這是如何實現的?
大家好,我是飛哥!今天和大家聊一個問題,一門語言是否可以在同一個進程內調用另外一門語言實現的函數?例如 C 語言是否可以調用 Golang 實現的函數?注意我說的是同進程內調用,跨進程的 IPC、PRC 之類的技術不算。直接拋出這個問題的答案,同進程跨語言調用是可行的。在各種語言設計時,爲了複用其它語言生態中積累下來的大量的代碼資產,都會實現跨語言調用的機制。例如在 Golang 中,實現了 cg ⌘ Read more
萬字長文:Go 語言現代命令行框架 Cobra 詳解
Cobra 是一個 Go 語言開發的命令行(CLI)框架,它提供了簡潔、靈活且強大的方式來創建命令行程序。它包含一個用於創建命令行程序的庫(Cobra 庫),以及一個用於快速生成基於 Cobra 庫的命令行程序工具(Cobra 命令)。Cobra 是由 Go 團隊成員 spf13 爲 Hugo 項目創建的,並已被許多流行的 Go 項目所採用,如 Kubernetes、Helm、Docker (di ⌘ Read more
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