yue-fang-readfog-go 

feeds.twtxt.net

No description provided.

Go 語言爲什麼很少使用數組?
01 介紹在 Go 語言中,數組是一塊連續的內存,數組不可以擴容,數組在作爲參數傳遞時,屬於值傳遞。數組的長度和類型共同決定數組的類型,不同類型的數組之間不可以比較,否則在編譯時會報錯。因爲數組的一些特性,我們在 Go 項目開發中,很少使用數組。本文我們介紹一下數組的特性。02 數組聲明方式在 Go 語言中,數組的聲明方式有三種。示例代碼:func main() { var arr1 [2]int ⌘ Read more

⤋ Read More

Go JSON 文件讀寫最佳實踐
*概述在 Go 語言中,JSON(JavaScript Object Notation)是一種常見的數據交換格式,用於在不同語言之間進行數據傳遞。本文將介紹 Go 語言中如何進行 JSON 文件的讀寫操作,包括解析與序列化,錯誤處理,以及一些實用技巧。一、JSON 文件基礎操作JSON 文件的讀取如何從 JSON 文件中讀取數據。package mainimport ( “encoding/js ⌘ Read more

⤋ Read More

每個 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

⤋ Read More

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

⤋ Read More

Go IsNil– 和 IsValid– 的精妙運用
*概述在 Go 語言中,反射是一項強大的特性,而 IsNil() 和 IsValid() 函數則是 reflect 包中兩個重要的函數,用於處理接口、通道、函數等各種類型。本文將深入介紹這兩個函數,解釋它們的用途、實際應用場景,並通過通俗易懂的例子更好地理解這兩個函數的神奇之處。一、IsNil() 函數判斷指針和接口是否爲 nilpackage mainimport ( “fmt” “refl ⌘ Read more

⤋ Read More

go-elasticsearch 使用指南
本文是 go-elasticsearch 庫的使用指南。go-elasticsearch 是 Elasticsearch 官方提供的 Go 客戶端。每個 Elasticsearch 版本會有一個對應的 go-elasticsearch 版本。官方會維護最近的兩個主要版本。go-elasticsearch 提供了 Low-level 和 Fully-typed 兩套 API。本文以 Fully-ty ⌘ Read more

⤋ Read More

Go 反射掌握指南:函數調用篇
*概述Go 語言的反射機制賦予了動態調用函數的能力。本文將介紹如何通過反射調用函數,以及基本函數、帶參函數、帶返回值函數等多種場景。一、獲取函數的反射對象獲取函數的反射對象package mainimport ( “fmt” “reflect”)// 定義一個示例函數func ExampleFunction(name string, age int) { fmt.Printf(“Hello, ⌘ Read more

⤋ Read More

Templ - 一種更好的管理 HTML 模板的 Go 語言框架
背景介紹在開發 Web 應用時我們常常需要寫 HTML 代碼以構建用戶界面。然而,創建和管理 HTML 模板可能會變得非常複雜和困難,特別是在大型項目中。要優化並整理這些模板代碼,我們需要一個強大且易於使用的模板語言。這種需求在使用 Go 語言開發 Web 應用時尤爲突出,因爲 Go 語言在內建支持的模板語言方面還不夠友好,尚有待提升。今天要給大家推薦一個 GitHub 開源項目 a-h/temp ⌘ Read more

⤋ Read More

Go 反射修改變量值全攻略
*概述Go 語言的反射機制爲提供了一種強大的方式來檢查和修改變量的值。本文將介紹如何通過反射修改變量的值,包括基本類型、結構體、切片等各種場景。一、反射對象獲取變量的反射對象package mainimport ( “fmt” “reflect”)func main() { // 定義一個整數變量 num := 42 // 使用reflect.ValueOf獲取反射對象 value : ⌘ Read more

⤋ Read More

Go 深度解析 ValueOf– 與 Value 的神奇魔法
*概述Go 語言中,反射機制提供了強大的工具,其中的 reflect 包中的 ValueOf() 和 Value 函數是反射的基礎。本文將介紹這兩個函數的作用機制,探討其在接口值轉換、參數傳遞規律等方面的實際運用。一、ValueOf 函數作用機制package mainimport ( “fmt” “reflect”)func main() { // 使用 ValueOf 獲取接口值的反射對 ⌘ Read more

⤋ Read More

Go 語言控制協程 -goroutine- 的併發數量,有哪些好的解決方法
在使用協程併發處理某些任務時, 其併發數量往往因爲各種因素的限制不能無限的增大. 例如網絡請求、數據庫查詢等等。從運行效率角度考慮,在相關服務可以負載的前提下(限制最大併發數),儘可能高的併發。在 Go 語言中,可以使用一些方法來控制協程(goroutine)的併發數量,以防止併發過多導致資源耗盡或性能下降。以下是一些常見的方法:1. 使用信號量(Semaphore):可以使用 Go 語言中的 c ⌘ Read more

⤋ Read More

Go 的分佈式應用:使用 Raft 算法
大家好!我是 [lincyang]。今天我們要探討的是如何在 Go 語言中使用 Raft 算法來構建分佈式應用。什麼是 Raft 算法?————Raft 算法是一種用於管理分佈式系統中的複製日誌的一致性算法。它的主要目標是簡化分佈式系統的構建和理解。爲什麼使用 Raft?———–Raft 算法相對於其他分佈式一致性算法(如 Paxos)來說,更易於理解和實現,同時也具 ⌘ Read more

⤋ Read More

老外總結的 14 條 Go 接口最佳實踐,有些不一樣
最近幾個月,沒事喜歡看看老外寫的技術文章,發現他們的一些思考維度真的有些不太一樣。當然,他們寫的文章大多數沒有國內的那麼卷。今天這篇文章是關於 Go 語言中接口設計的一些最佳實踐,與 Java 等語言不盡相似,但又帶着 Go 語言的特色,可以對照學習,拓展編程思想層面的認知面。以下是在 Go 中使用接口的一些最佳實踐:1、優先小接口:接口是 Go 中的強大工具,但要保持它們小巧並專注於特定任務。這 ⌘ Read more

⤋ Read More

Go 標籤實踐手冊,結構體標籤應用全攻略
*概述結構體標籤,作爲 Go 語言中獨有的元信息機制,提供了在運行時對結構體字段進行註釋和標記的能力。本文將介紹 Go 語言中結構體標籤的概念、自定義創建和處理、應用場景、標籤信息查詢以及代碼生成場景應用,帶讀者深入瞭解結構體標籤的細節和最佳實踐。一、結構體標籤概念標籤定義和格式解析package mainimport ( “fmt” “reflect”)// 定義一個包含標籤的結構體type ⌘ Read more

⤋ Read More

Go 的事件驅動編程:使用 EventBus 實現
大家好!我是 [lincyang]。今天我們要探討的是 Go 語言中的事件驅動編程,特別是如何使用 EventBus 來實現這一目標。什麼是事件驅動編程?———-事件驅動編程是一種編程範式,其中應用程序的流程由外部事件(如用戶輸入或系統觸發的事件)來控制。這種方法在 GUI 應用、網絡編程和實時系統中尤爲常見。爲什麼選擇 EventBus?—————EventBus ⌘ Read more

⤋ Read More

Go 項目的簡單部署
概述–在上一篇筆記記錄了 Gin 實現簡單的註冊登錄和狀態管理。這一篇筆記來分享一下如何將上面的項目打包鏡像和部署,筆記分成三部分,分別是 Web 後端項目 Docker 鏡像的構建、使用 Docker 運行、使用 Docker Compose 和 k8s 部署容器。使用 Ingress 路由規則和 Web 前端的部署運行在下一篇筆記中記錄。構建 Docker 鏡像————概述構 ⌘ Read more

⤋ Read More

conc 使用指南
conc 使用指南conc 是由 sourcegraph 開源的一套友好的結構化併發工具包,其中總結了 sourcegraph 內部在編寫併發代碼時反覆遇到的問題的解決方案。conc.WaitGroup————–conc 庫中的WaitGroup是作用域併發的主要構建塊。調用其Go方法能夠生成 goroutine,調用其Wait方法可以確保在生成的 goroutine 都退出後再 ⌘ Read more

⤋ Read More

Go 反射機制揭祕:輕鬆獲取結構體成員類型
*概述Go 語言的反射機制提供了強大的工具,使得在運行時獲取結構體的成員類型成爲可能。本文將介紹如何用反射實現結構體成員類型的獲取,包括結構字段的遍歷、按名稱訪問結構成員、處理匿名字段及內嵌類型,以及解析字段標籤元信息的方法。一、結構字段遍歷值對象及類型對象package mainimport ( “fmt” “reflect”)type User struct { ID int Na ⌘ Read more

⤋ Read More

介紹 Agency: 使 AI 與 Go 語言無縫對接
在當今應用開發領域,類似 OpenAI API 等生成式 AI 技術的蓬勃發展正在徹底改變着應用開發的格局。Python 和 JavaScript 等語言已經擁有豐富的資源來支持這些技術,其中 LangChain 就是一個顯著的例子。然而,Go 語言開發者面臨的選擇卻相對有限。LangChainGo,作爲 LangChain 的 Go 語言版本,一直在努力與 Go 的編程理念保持一致,而 Lang ⌘ Read more

⤋ Read More

Go 反射深度揭祕之 reflect-Elem– 方法解析
*概述Go 語言中的反射機制提供了強大的工具,能夠在運行時獲取和操作變量的信息。其中,reflect.Elem() 方法是一個重要的利器,通過它能夠獲取指針指向的元素類型,提供更多的靈活性。本文將解析 reflect.Elem() 的方法簽名、作用機制,並通過豐富的示例演示其調用方式。一、Elem() 方法解析方法簽名func (v Value) Elem() ValueElem() 方法是 re ⌘ Read more

⤋ Read More

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

⤋ Read More

Go 反射之 reflect-TypeOf– 和 reflect-Type
*概述在 Go 語言中,反射是一項強大的特性,它允許程序在運行時動態獲取變量的類型信息,進行類型操作與轉換,甚至能夠對結構體和函數進行反射操作。本文將探討 reflect.TypeOf() 和 reflect.Type,揭示 Go 語言 中反射的奧祕。一、reflect.TypeOf() 函數返回反射 Type 對象reflect.TypeOf() 函數用於獲取一個變量的反射 Type 對象。它接 ⌘ Read more

⤋ Read More

Go 工具鏈詳解之升級版本不用愁的 go tool fix
go tool fix 作用go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正爲新版本的代碼(這裏所說的版本是 Golang 的版本)。升級 Go 版本之後,使用這個命令可以自動對程序進行必要的更改。Golang 的演進過程中,對一些函數和標準庫進行改進是難免的,改進過程中有可能會出現兼容問題,一旦出現了兼容問題,從舊版本升級到新版本的代價 ⌘ Read more

⤋ Read More

Gorm 中的遷移指南
在應用程序開發的不斷變化的景觀中,數據庫模式更改是不可避免的。GORM,強大的 Go 對象關係映射庫,通過遷移提供了一種無縫的解決方案來管理這些變化。本文將作爲您全面的指南,幫助您掌握使用 GORM 進行數據庫遷移和模式管理。我們將深入探討自動遷移、創建和應用遷移,以及在您的 Go 項目中優雅處理不斷髮展的模式需求的策略。GORM 中的自動遷移———–自動遷移是一個重要的改進,確保您 ⌘ Read more

⤋ Read More

go-mongox:簡單高效,讓文檔操作和 bson 數據構造更流暢
大家好,我是 陳明勇,一個熱愛技術,喜歡鑽研技術的程序員。前言在 Go 語言中使用 MongoDB 官方框架進行集合操作時,深深感到構建 bson 數據是一件非常繁瑣的工作。字段、逗號,括號等符號的排列,讓我感覺彷彿是在進行一場拼圖遊戲。因此我在想,有沒有一個能讓我絲滑,高效操作 MongoDB 的第三方框架呢,遺憾的是,並沒有找到符合我預期的框架,索性我就自己動手開發了一個,這就是 go-mon ⌘ Read more

⤋ Read More

Go 反射終極指南:從基礎到高級全方位解析
在本文中,我們將全面深入地探討 Go 語言的反射機制。從反射的基礎概念、爲什麼需要反射,到如何在 Go 中實現反射,以及在高級編程場景如泛型編程和插件架構中的應用,本文爲您提供一站式的學習指南。一、簡介反射是一種讓程序在運行時自省(introspect)和修改自身結構和行爲的機制。雖然這聽起來有點像 “自我觀察”,但實際上,反射在許多現代編程語言中都是一個非常強大和重要的工具。Go 語言也不例 ⌘ Read more

⤋ Read More

17 個開源的 Go 語言博客和 CMS 解決方案
Go 語言,也稱爲 Golang,是一種爲構建高效、可靠和可擴展軟件而設計的開源編程語言。它於 2007 年在 Google 開發,現在廣泛用於開發 Web 應用程序、網絡工具和系統軟件。爲什麼使用基於 Go 的 CMS 解決方案?———————-這些優勢使 Go 成爲開發可擴展、高性能應用程序的熱門選擇。在使用 Go 構建基於 Web 的解決方案時,其速度是其中一個主 ⌘ Read more

⤋ Read More

Gin 如何實現跨域
什麼叫做跨域    ”跨域” 是一個網絡安全的概念,起源於瀏覽器的同源策略。同源策略是一種約定,它是由網景(Netscape)公司提出的一個重要的安全策略。所謂同源是指 “協議 + 域名 + 端口號” 三者相同,只要不同時,就算是不同源。    換句話說,”跨域” 指的是從一個域名的網頁去請求另一個域名的資源。例如,”http://website1.com” 的網頁通過 Ajax 獲取 “http ⌘ Read more

⤋ Read More

TCP 基礎詳解:Telnet 迴音服務器搭建
*概述Telnet 迴音服務器是一個簡單而實用的網絡應用,通過 Telnet 協議連接,用戶輸入什麼,服務器就回顯什麼。本文將介紹如何使用 Go 語言創建一個 Telnet 迴音服務器,通過完整的示例代碼和詳細註釋,便於理解 TCP 服務器的基本結構和實現。1. TCP 服務器基礎TCP 協議簡介package mainimport (“fmt”“net”)func main() { liste ⌘ Read more

⤋ Read More

無縫集成 GORM 與 Go Web 框架
探索 GORM 與流行的 Go Web 框架之間的和諧集成,以實現高效的數據管理—————————————-高效的數據管理是每個成功的 Web 應用程序的基礎。GORM,多才多藝的 Go 對象關係映射庫,與流行的 Go Web 框架非常搭配,提供了無縫集成,簡化了數據交互。本指南將帶您探索 GORM 與諸如 Gin、Echo 和 Beego 等 ⌘ Read more

⤋ Read More

Go 語言中的反射機制
在 Go 語言的衆多高級特性中,反射(Reflection)是一個強大且複雜的概念。它使得程序能夠在運行時檢查、修改其自身結構。反射在處理接口和類型斷言、開發通用功能或者設計框架時尤爲重要。本文將深入探索 Go 語言中的反射機制,通過具體的示例展示如何使用 reflect 包,讓你能夠在 Go 項目中有效地利用這一強大的工具。Go 反射基礎——-反射的概念反射是指計算機程序在運行時(run ⌘ Read more

⤋ Read More

使用 Go 語言創建自己的密碼加密工具
Go 語言藉助它的簡單性和強大的標準庫,實現一個自己的密碼加密工具非常簡單。在本篇文章中,我們將會結合代碼示例深入探討如何使用 Go 語言的 crypto 包來實現自己的加密工具。首先,我們需要 import 必要的包:package mainimport (    ”crypto/aes”    ”crypto/cipher”    ”crypto/rand”    ”fmt”    ”io”) ⌘ Read more

⤋ Read More

一篇文章帶你瞭解 Go 語言基礎之併發(channel)
前言–Hi,大家好,我是碼農,星期八,本篇繼續帶來 Go 語言併發基礎,channel 如何使用。看看 Go 協程如何配合 channel。快來上車叭。爲什麼需要 channel————-channel 在 Go 中,也叫做管道,是用來多線程之間共享數據的。通常情況下,在 Go 中共享數據用的也是channel,但是在 Go 有兩種共享數據方式。共享內存實現通訊。 通過管道 ⌘ Read more

⤋ Read More

Go 淺析主流日誌庫:從設計層學習如何集成日誌輪轉與切割功能
前言在現有的日誌庫中,包括 go 1.21.0 引入的 slog 日誌庫,它們通常都支持對日誌文件進行輪轉與切割,只不過這些功能並不直接被內置,而是需要我們主動配置來啓用。本文將探討幾個熱門的日誌庫如 logrus、zap 和官網的 slog,我將分析這些庫的的關鍵設計元素,探討它們是如何支持日誌輪轉與切割功能的配置。 淺析 logrus、zap 和 slog 的設計在對 logrus、zap 和 ⌘ Read more

⤋ Read More

一文搞懂 Go gRPC 服務 Handler 單元測試
在雲原生時代和微服務架構背景下,HTTP 和 RPC 協議成爲服務間通信和與客戶端交互的兩種主要方式。對於 Go 語言而言,標準庫提供了 net/http/httptest 包,爲開發人員提供了便捷的方式來構建服務端 HTTP Handler 單元測試的測試腳手架代碼,而無需真正建立 HTTP 服務器,讓開發人員可以聚焦於對 Handler 業務邏輯的測試。比如下面這個示例:// grpc-tes ⌘ Read more

⤋ Read More

Go: select 實戰指南:協程切換技術
概述Go 語言的併發編程模型以其簡潔而強大的 goroutine 爲特色。而 select 語句則是在多個通信操作中選擇一個執行的關鍵工具。本文將討論如何使用 select 切換協程,通過清晰的示例代碼,幫助讀者掌握這一重要的併發編程技巧。select 語句的基本結構package mainimport ( “fmt” “time”)func main() { ch1 := make(chan s ⌘ Read more

⤋ Read More

Go 語言讀取 YAML 配置文件教程
在 Go 語言項目中,處理配置文件是一項常見的任務。YAML 是一種易讀易寫的配置文件格式,本教程將指導你如何在 Go 中讀取和解析 YAML 文件。我們將按照章節的形式逐步介紹相關的概念和示例代碼。第一章:引入依賴——–在開始之前,我們需要引入一個 YAML 解析的第三方庫。推薦使用 gopkg.in/yaml.v2。go get gopkg.in/yaml.v2第二章:創建 YAML ⌘ Read more

⤋ Read More

Go 打造高效的聊天系統
*概述構建一個高效的 Go 語言聊天服務器是一個具有挑戰性而又令人興奮的任務。本文將通過示例代碼和註釋,逐步實現一個功能強大的 Go 語言聊天服務器。通過清晰的項目結構和合理的邏輯劃分,將能夠理解服務器的設計和實現。1. 項目規劃與結構設計1.1 項目規劃在開始構建聊天服務器之前,需要進行項目規劃。明確通信協議、確定服務器功能和定義用戶管理方式是關鍵步驟。1.2 結構設計設計一個清晰的結構是確保項 ⌘ Read more

⤋ Read More

Go 語言 CSP 編程實戰:通道通信技術
*概述通信順序進程(Communicating Sequential Processes,CSP)是一種併發編程的形式化理論,由計算機科學家 Tony Hoare 於 1978 年提出。在 Go 語言中,CSP 被廣泛應用,通過通道(Channel)實現了簡單且強大的併發模型。本文將介紹 Go 語言中的 CSP 概念,通過詳細的示例代碼和註釋,理解 CSP 的運作原理和在 Go 中的實現。1. C ⌘ Read more

⤋ Read More

從 Discord 的做法中學習 — 使用 Golang 進行請求合併
正如你可能之前看到的,Discord 去年發佈了一篇有價值的文章,討論了他們成功存儲了數萬億條消息。雖然有很多關於這篇文章的 YouTube 視頻和文章,但我認爲這篇文章中一個名爲 “數據服務爲數據服務” 的部分沒有得到足夠的關注。在這篇文章中,我們將討論 Discord 對數據服務的方法,並探討如何利用 Golang 的併發特性來減少特定情況下的數據庫負載。數據服務拯救熱分區如你所知,消息和頻道 ⌘ Read more

⤋ Read More

Go 排序算法探祕:打造通用 qsort 函數
*概述快速排序(QuickSort)是一種經典的排序算法,其高效性和廣泛應用使之成爲計算機科學領域的瑰寶。本文將介紹如何在 Go 語言中封裝快速排序函數,使其更易用、更具通用性,並通過示例和代碼解釋,讓讀者深入瞭解其原理和實現。1. 快速排序算法簡介1.1 算法原理快速排序是一種分治策略的排序算法,基本思想是通過選定一個基準元素。將序列分爲兩部分,小於基準的元素放在左邊,大於基準的元素放在右邊,然 ⌘ Read more

⤋ Read More

Go 語言項目命名規範(2023 年最新版)
在 Go 語言中,良好的命名規範是構建清晰、可讀和可維護代碼的關鍵。本指南旨在幫助你制定一致的命名規範,使你的 Go 項目更加整潔和易於理解。在實際項目開發中,每個項目組的成員開發習慣不一樣,可能會有自己的一些規範,所以這個規範僅供參考。第一章:包命名規範在 Go 中,包是代碼組織的基本單元。包名應該簡短而具有描述性。使用小寫字母: 包名應該使用小寫字母,不要使用下劃線或混合大小寫。 ⌘ Read more

⤋ Read More