\\*1\\. Protobuf 簡介1.1 Protobuf 是什麼Protocol Buffers (簡稱 Protobuf) 是 Google 公司開源的一種輕便高效的結構化數據存儲格式, 以及用於序列化和反序列化結構化數據的代碼生成器。它可以用於通訊協議和數據存儲等領域。Protobuf 是以 .proto 文件形式定義結構化數據的方式和格式。並且通過代碼生成器生成各平臺 (Java、C++、Py ⌘ Read more*
\\*1\\. Protobuf 簡介1.1 Protobuf 是什麼Protocol Buffers (簡稱 Protobuf) 是 Google 公司開源的一種輕便高效的結構化數據存儲格式, 以及用於序列化和反序列化結構化數據的代碼生成器。它可以用於通訊協議和數據存儲等領域。Protobuf 是以 .proto 文件形式定義結構化數據的方式和格式。並且通過代碼生成器生成各平臺 (Java、C++、Py ⌘ Read more*
0 導讀去年 4 月的時候,我和大家分享了一篇文章——初探 rocksDB 之 lsm tree,和大家一起探討了 lsm tree 結構的底層實現原理. 秉着 【基於源碼支撐原理】 的一貫原則,從本期開始,咱們把源碼篇的坑填上.接下來我將開啓一個新的專題——基於 go 語言從零到一實現 lsm tree,本專題共分爲下述四篇內容:• 基於 go 實現 lsm tree 之主幹框架(本篇) ⌘ Read more
\\*一、gRPC 簡介gRPC(Remote Procedure Call) 是一種遠程過程調用技術, 通過壓縮和序列化數據來優化網絡通信, 可以顯著提高服務調用的性能和效率。gRPC 的概念gRPC 是一個高性能、通用的開源 RPC 框架, 是一個由 Google 主導開發的 RPC 框架。其以 HTTP/2 爲基礎通信協議, 支持多種語言, 通過 protocol buffers 數據格式來實現 ⌘ Read more*
\*一、gRPC 簡介gRPC(Remote Procedure Call) 是一種遠程過程調用技術, 通過壓縮和序列化數據來優化網絡通信, 可以顯著提高服務調用的性能和效率。gRPC 的概念gRPC 是一個高性能、通用的開源 RPC 框架, 是一個由 Google 主導開發的 RPC 框架。其以 HTTP/2 爲基礎通信協議, 支持多種語言, 通過 protocol buffers 數據格式來實現 ⌘ Read more*
前言-----很久沒更新博客,這次正好趁着這次機會來更新一個稍微有點意思的內容,利用 C++ 中 Opencv、TensorRT 等庫編譯出動態庫供 Go 調用,再寫個簡單的 api 對上傳的車輛圖片進行車牌識別。究其原因,天下苦 Java 久矣,每次寫 JNI 去給公司 Java 後端服務調用,而我不喜歡 Java 那我每次寫好的模型動態庫就到此爲止了?白白浪費之前那麼多計算資源於心不忍,因此打 ⌘ Read more
\*1\. Go 語言插件基礎1.1 插件概述插件是一種動態加載的代碼單元, 它可以在程序運行期間被動態加載和掛接到主程序上, 從而擴展主程序的功能。Go 語言從 1.8 版本開始, 通過 plugin 包提供了對插件的初步支持。利用插件, 可以在不需要重新編譯主程序的情況下, 動態地擴展主程序的功能, 做到高內聚低耦合。1.2 插件的定義和結構從實現上看, Go 語言的插件就是一個獨立編譯的 dyn ⌘ Read more*
\\*1\\. Go 語言插件基礎1.1 插件概述插件是一種動態加載的代碼單元, 它可以在程序運行期間被動態加載和掛接到主程序上, 從而擴展主程序的功能。Go 語言從 1.8 版本開始, 通過 plugin 包提供了對插件的初步支持。利用插件, 可以在不需要重新編譯主程序的情況下, 動態地擴展主程序的功能, 做到高內聚低耦合。1.2 插件的定義和結構從實現上看, Go 語言的插件就是一個獨立編譯的 dyn ⌘ Read more*
序2022 年 3 月 15 日,爭議非常大但同時也備受期待的泛型終於伴隨着 Go1.18 發佈了。可是因爲 Go 對泛型的支持時間跨度太大,有非常多的以 “泛型” 爲關鍵字的文章都是在介紹 Go1.18 之前的舊泛型提案或者設計,而很多設計最終在 Go1.18 中被廢棄或發生了更改。並且很多介紹 Go1.18 泛型的文章 (包括官方的) 都過於簡單,並沒對 Go 的泛型做完整的介紹,也沒讓大家意 ⌘ Read more
在 Go 語言中,實現程序的優雅退出是一項重要的任務,特別是在涉及到 HTTP 服務器、gRPC 服務器、以及其他後臺工作的情況下。以下是一些常見的平滑關閉方法:1. HTTP Server 平滑關閉Go 1.8 及以上版本提供了 http.Server 結構的 Shutdown 方法,用於平滑關閉 HTTP 服務器。package mainimport ( "context" "ne ⌘ Read more
在使用 Golang 進行復雜的開發任務時,處理一個結構體有許多可選的配置項是常有的事。這也是在許多函數設計中共有的特徵,因爲這使得函數更容易使用,靈活性更強。然而,有時我們可能會看到錯誤的實踐,那就是 “遺漏使用 Function Option 模式”。在這篇文章中,我將詳細解釋Function Option的概念,並指出爲什麼我們應該使用它。我還將給出實例來展示如果忽略了Function Op ⌘ Read more
Go 語言,由於其高效強大的並行處理能力和優雅簡單的設計哲學,一直以來都是編程世界的寵兒。然而,對於一些 Go 新手和甚至熟悉 Go 的程序員也可能會遇到一個常見的錯誤: any沒傳遞任何信息。那麼,如何規避這個錯誤呢?本文將揭示其中的祕密。問題描述----首先,在 Go 中的接口類型interface{}(也被稱作 “any” 類型)是一種空接口類型,可以接受任何類型的參數,無論是用戶自定義的類 ⌘ Read more
大家好,我是煎魚。前段時間我們在聊手動管理內存 arena 的後續時。我們有提到 context 的函數傳參等問題。當時在評論區有許多的小夥伴交流了起來,大家對此還是非常關注的:今天我們就來聊一聊 conetxt 傳參的這個事。到底擺哪?Go 官方推薦是什麼?快速介紹----上下文(Context)是 Go 語言中非常有特色的一個特性,其主要的作用是在 goroutine 中進行上下文的傳遞,而在 ⌘ Read more
\\*1\\. 垃圾回收概述1.1 什麼是垃圾回收垃圾回收 (Garbage Collection,GC) 是一種自動內存管理的機制, 用於自動釋放那些不再被程序使用的內存。它的主要思想是程序在申請內存時不需要釋放, 而是由垃圾回收器在程序運行的過程中找出那些不再使用的內存並回收它們。這與 C/C++ 語言中的手動內存管理形成對比, C/C++ 程序員需要自己跟蹤內存的分配和釋放。而 Go 語言中內存的分 ⌘ Read more*
\*1\. 垃圾回收概述1.1 什麼是垃圾回收垃圾回收 (Garbage Collection,GC) 是一種自動內存管理的機制, 用於自動釋放那些不再被程序使用的內存。它的主要思想是程序在申請內存時不需要釋放, 而是由垃圾回收器在程序運行的過程中找出那些不再使用的內存並回收它們。這與 C/C++ 語言中的手動內存管理形成對比, C/C++ 程序員需要自己跟蹤內存的分配和釋放。而 Go 語言中內存的分 ⌘ Read more*
\*一、Go 語言內存管理簡介Go 語言自動內存管理機制Go 語言以其簡潔高效的特性而備受開發者推崇,其中自動內存管理是其引以爲傲的一項特性。與傳統的手動內存管理語言不同,Go 語言通過垃圾回收器(GC)自動管理內存,極大地減輕了開發者的負擔。Go 語言的垃圾回收器採用的是基於併發標記 - 清除算法,這意味着垃圾回收的過程中,程序的執行並不會完全停滯,從而保證了較低的暫停時間。內存分配與回收策略Go ⌘ Read more*
\\*一、Go 語言內存管理簡介Go 語言自動內存管理機制Go 語言以其簡潔高效的特性而備受開發者推崇,其中自動內存管理是其引以爲傲的一項特性。與傳統的手動內存管理語言不同,Go 語言通過垃圾回收器(GC)自動管理內存,極大地減輕了開發者的負擔。Go 語言的垃圾回收器採用的是基於併發標記 - 清除算法,這意味着垃圾回收的過程中,程序的執行並不會完全停滯,從而保證了較低的暫停時間。內存分配與回收策略Go ⌘ Read more*
\\*一、Go 語言調用 C/C++ 函數cgo 基礎及工作原理Go 語言通過 cgo 和 C 語言的 ABI(Application Binary Interface) 進行交互。cgo 會生成相應的 C 代碼, 與 Go 代碼一起編譯成可執行文件或動態庫。cgo 的工作流程主要分爲 3 步:(1) 預處理: 將 Go 源碼中的 C 代碼塊提取出來, 生成 .c 和 .h 文件(2) 編譯: 調用 ⌘ Read more*
\*一、Go 語言調用 C/C++ 函數cgo 基礎及工作原理Go 語言通過 cgo 和 C 語言的 ABI(Application Binary Interface) 進行交互。cgo 會生成相應的 C 代碼, 與 Go 代碼一起編譯成可執行文件或動態庫。cgo 的工作流程主要分爲 3 步:(1) 預處理: 將 Go 源碼中的 C 代碼塊提取出來, 生成 .c 和 .h 文件(2) 編譯: 調用 ⌘ Read more*
這篇文章我們來了解一下隱藏在 Go 運行時中的一些併發原語, 因爲運行時是底座和包循環依賴等原因,運行時中很少使用標準庫中的併發原語,它有自己的併發原語。mutex在 runtime/runtime2.go[1] 定義了一個互斥鎖,它的定義如下:type mutex struct { lockRankStruct key uintptr}它可是運行時中的大紅人了,在很多數據結構中都被廣泛的使用,凡 ⌘ Read more
\\*一、pprof 命令簡介pprof 的功能和作用Go 語言提供了一個強大的性能分析工具,即 pprof(profiling and tracing)。pprof 可以幫助開發者深入瞭解應用程序的性能狀況,從而更好地進行性能優化。其主要功能包括: CPU Profiling:定位 CPU 密集型任務,找到瓶頸; Memory Profiling:檢測內存使用情況,發現潛在的內存泄漏; ⌘ Read more*
\*一、pprof 命令簡介pprof 的功能和作用Go 語言提供了一個強大的性能分析工具,即 pprof(profiling and tracing)。pprof 可以幫助開發者深入瞭解應用程序的性能狀況,從而更好地進行性能優化。其主要功能包括: CPU Profiling:定位 CPU 密集型任務,找到瓶頸; Memory Profiling:檢測內存使用情況,發現潛在的內存泄漏; ⌘ Read more*
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=
\\*1\\. test 命令概述在開發過程中,測試是確保代碼質量和穩定性的關鍵步驟。通過測試,可及早發現潛在的問題,確保代碼的正確性和可維護性。Go 語言提供了強大的測試工具,其中 go test 命令是一個不可或缺的利器。1.1 單元測試單元測試是驗證代碼中最小可測試單元的過程。在 Go 中,單元測試通常位於與被測試代碼相同的包中,以 test.go 結尾的文件中。go test 會執行這些文件中的測 ⌘ Read more*
\*1\. test 命令概述在開發過程中,測試是確保代碼質量和穩定性的關鍵步驟。通過測試,可及早發現潛在的問題,確保代碼的正確性和可維護性。Go 語言提供了強大的測試工具,其中 go test 命令是一個不可或缺的利器。1.1 單元測試單元測試是驗證代碼中最小可測試單元的過程。在 Go 中,單元測試通常位於與被測試代碼相同的包中,以 test.go 結尾的文件中。go test 會執行這些文件中的測 ⌘ Read more*
Golang Fiber 是一個靈感來源於 Express.js 的 Web 開發框架,它旨在簡化 Go 語言中的 HTTP 服務開發,同時提供極高的性能。它基於 Fasthttp,這是一個快速的 HTTP 引擎,專爲高性能而設計。在這篇文章中,我們會詳細介紹如何使用 Fiber 創建 web 應用程序,並提供豐富的示例。開始前的準備------在開始之前,確保你已安裝了 Go 語言環境。你可以在 ⌘ Read more
大家好,我是煎魚。風水輪流轉,Go 程序寫多了。總是會這有點問題,那有點問題。問題積累久了就容易出點事件,甚至是事故。這種時候大家往往會想着引入一些靜態分析工具來解決這個問題。元旦假期時剛好看到這個新輪子,分享給大家!NilAway 分析工具------------最近 Uber 開發和開源了一個挺不錯的靜態分析工具 NilAway:使用場景是:在 Go 程序編譯時就能捕獲 nil,達到幫助開發人 ⌘ Read more
當需要向服務端通過 http api 上傳大文件時候,通常會使用以下這種方式func main(){ filename := "nohup.out" body := new(bytes.Buffer) writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("file", filename ⌘ Read more
\*1\. go install 命令簡介go install 命令是 Go 語言的標準命令, 用於編譯和安裝 Go 語言程序。1.1 命令作用及基本原理go install 命令的主要作用是編譯和安裝 Go 語言的可執行文件或庫文件。它的基本原理是: 1. 按照包依賴關係編譯傳遞進來的 main 包及其所有依賴的包 2. 鏈接必要的包生成可執行文件 3. 將生成的可執行文件拷貝到 ⌘ Read more*
\\*1\\. go install 命令簡介go install 命令是 Go 語言的標準命令, 用於編譯和安裝 Go 語言程序。1.1 命令作用及基本原理go install 命令的主要作用是編譯和安裝 Go 語言的可執行文件或庫文件。它的基本原理是: 1. 按照包依賴關係編譯傳遞進來的 main 包及其所有依賴的包 2. 鏈接必要的包生成可執行文件 3. 將生成的可執行文件拷貝到 ⌘ Read more*
一、前言Golang 定時器包括:一次性定時器(Timer)和週期性定時器 (Ticker)。編程中經常會通過 timer 和 ticker、AfterFunc。定時器 NewTicker 是設定每隔多長時間觸發的,是連續觸發,而計時器 NewTimer 是等待多長時間觸發的,只觸發一次,兩者是不同的。等待時間函數 AfterFunc 是在 After 基礎上加了一個回調函數,是等待時間到來後在另 ⌘ Read more
\\*1\\. Go Build 命令介紹1.1 基本語法格式Go 語言的 go build 命令用於編譯一個或多個 Go 源代碼文件,生成可執行文件或包。基本語法格式如下go build [標誌] [包名] 標誌:用於指定編譯時的選項和參數。 包名:可選,指定要編譯的包的路徑。如果省略包名,將編譯當前目錄下的所有 Go 源代碼文件。 go build 命令的工作原理包括以下步驟: 1. 分 ⌘ Read more*
\*1\. Go Build 命令介紹1.1 基本語法格式Go 語言的 go build 命令用於編譯一個或多個 Go 源代碼文件,生成可執行文件或包。基本語法格式如下go build [標誌] [包名] 標誌:用於指定編譯時的選項和參數。 包名:可選,指定要編譯的包的路徑。如果省略包名,將編譯當前目錄下的所有 Go 源代碼文件。 go build 命令的工作原理包括以下步驟: 1. 分 ⌘ Read more*
\*1\. go run 命令簡介在 Go 語言開發中,go run 命令是一個非常常見且便捷的工具,它用於編譯並直接運行 Go 語言源代碼文件,而不需要生成可執行文件。本文將深入介紹 go run 的語法、常見用法實例、編譯命令行選項、注意事項,以及與 go build、go install 的區別和常見用途。2. go run 語法 go run 命令的基本語法爲:go run [文件名.go] ⌘ Read more*
\\*1\\. go run 命令簡介在 Go 語言開發中,go run 命令是一個非常常見且便捷的工具,它用於編譯並直接運行 Go 語言源代碼文件,而不需要生成可執行文件。本文將深入介紹 go run 的語法、常見用法實例、編譯命令行選項、注意事項,以及與 go build、go install 的區別和常見用途。2. go run 語法 go run 命令的基本語法爲:go run [文件名.go] ⌘ Read more*
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
Go 語言作爲一門靜態類型的編程語言,提供了豐富的類型系統。在這個類型系統中,nil 扮演着空值的角色,類似於其他編程語言中的 null 或 None。然而,在 Go 中,對於 nil 的處理與其他語言有着本質的不同,這導致了一些獨特的行爲,尤其是在不同類型的 nil 比較時。什麼是 nil?--------在 Go 中,nil 是一個預聲明的標識符,它可以代表某些類型的零值。具體來說,下列類型的 ⌘ Read more
\\*1\\. go clean 命令介紹命令作用和使用場景在 Go 語言開發中,go clean 命令是一個強大的工具,用於清除與 Go 構建相關的文件和目錄。它通常在項目維護、優化和 CI/CD 任務中發揮重要作用。使用場景包括但不限於: 在提交代碼前,清理本地構建產物,確保提交的是源代碼而非編譯文件。 在項目重構或遷移時,清理舊有構建產物,避免與新的代碼混淆。 在 CI/CD 流程中, ⌘ Read more*
\*1\. go clean 命令介紹命令作用和使用場景在 Go 語言開發中,go clean 命令是一個強大的工具,用於清除與 Go 構建相關的文件和目錄。它通常在項目維護、優化和 CI/CD 任務中發揮重要作用。使用場景包括但不限於: 在提交代碼前,清理本地構建產物,確保提交的是源代碼而非編譯文件。 在項目重構或遷移時,清理舊有構建產物,避免與新的代碼混淆。 在 CI/CD 流程中, ⌘ Read more*
通過消息推送,我們可以實時的獲取有效的信息。比如結果,驗證碼以及一些重要的通知場景等。今天要分享的是 gotify,是一個用 go 編寫的消息服務端,也有客戶端,通過 gotify 我們可以簡單的進行收發消息。gotify 的 地址將會在文末展示。gotify 支持的功能如下可以通過 restapi 發送消息 可以通過 websocket 接收消息 可以管理用戶和客戶端以及應用程序 ⌘ Read more
\\*1\\. INI 文件簡介INI(Initialization)文件是一種簡單、文本文件格式,常用於配置文件。它由多個節(section)組成,每個節包含多個鍵值對。鍵值對的格式爲 key=value,節的格式爲 [section]。簡單示例如下:// 示例INI文件[database]host = localhostport = 3306username = userpassword = sec ⌘ Read more*=
\*1\. INI 文件簡介INI(Initialization)文件是一種簡單、文本文件格式,常用於配置文件。它由多個節(section)組成,每個節包含多個鍵值對。鍵值對的格式爲 key=value,節的格式爲 [section]。簡單示例如下:// 示例INI文件[database]host = localhostport = 3306username = userpassword = sec ⌘ Read more=*
\\*1\\. tar 文件的概述打包和壓縮多個文件在文件處理中,經常需要將多個文件打包成一個歸檔文件以便傳輸或存儲。tar 文件就是一種常見的歸檔文件格式,它能夠將多個文件和文件夾組織成一個單一的文件。結構簡單,跨平臺特性好Tar 文件採用簡單的文件組織結構,這種結構使得 tar 文件在不同操作系統之間具有很好的兼容性。Go 語言通過標準庫內置了對 tar 文件的支持,使得在 Go 中處理 tar 文件 ⌘ Read more*
\*1\. tar 文件的概述打包和壓縮多個文件在文件處理中,經常需要將多個文件打包成一個歸檔文件以便傳輸或存儲。tar 文件就是一種常見的歸檔文件格式,它能夠將多個文件和文件夾組織成一個單一的文件。結構簡單,跨平臺特性好Tar 文件採用簡單的文件組織結構,這種結構使得 tar 文件在不同操作系統之間具有很好的兼容性。Go 語言通過標準庫內置了對 tar 文件的支持,使得在 Go 中處理 tar 文件 ⌘ Read more*
大家好,我是小❤,一個漂泊江湖多年的 985 非科班程序員,曾混跡於國企、互聯網大廠和創業公司的後臺開發攻城獅。引言-----內存管理,是開發者在程序編寫和調優的過程中不可繞開的話題,也是走向資深程序員必須要了解的計算機知識。有經驗的面試官會從內存管理的掌握程度去考察一個候選人的技術水平,這裏面涉及到的知識可能包括操作系統、計算機組成原理以及編程語言的底層實現等。說到內存,其實就是存儲器,我們可以 ⌘ Read more
如何用 Golang 實現簡潔架構?本文介紹了基於 Go-Kit 實現簡潔架構的嘗試,通過示例介紹了簡潔架構的具體實現。原文: Why is Go-Kit Perfect For Clean Architecture in Golang?[1]簡介Go 是整潔架構 (Clean Architecture) 的完美選擇。整潔架構本身只是一種方法,並沒有告訴我們如何構建源代碼,在嘗試用新語言實現時 ⌘ Read more
Uber 開源的 FX 可以幫助 Go 應用解耦依賴,實現更好的代碼複用。原文: How to build large Golang applications using FX[1] 構建複雜的 Go 應用程序可能會引入很多耦合Golang 是一種流行編程語言,功能強大,但人們還是會發現在處理依賴關係的同時組織大型代碼庫很複雜。Go 開發人員有時必須將依賴項的引用傳遞給其他人,從而造成重用代碼 ⌘ Read more
你是否用過 protobuf 或 gRPC? 你們公司項目的 API 有沒有用到 proto 文件? 本文將帶你一步一步寫個類似protoc-gen-go-grpc的 proto 文件生成工具,從 proto 文件生成兼容 Go 標準庫的 HTTP 框架代碼。掌握它之後,你就能隨心所欲的從 proto 文件生成gin、echo、net/http代碼,甚至生成你自己的框架代碼。 別擔心 ⌘ Read more
有時候批量積攢一批數據集中處理,是一個高效的提高程序性能的方法,比如我們可以批量寫入數據庫,批量發送消息到 kafka,批量寫入網絡數據等等。 批量把數據收集出來,我們常用 channel 類型,此時 channel 的功能就是一個 buffer, 多個生產者把數據寫入到 channel 中,消費者從 channel 中讀取數據,但是 Go 的 channel 並沒有提供批量讀取的方法,我們需要自 ⌘ Read more
在分佈式系統中,實現跨不同服務或節點的同步操作是一個常見的挑戰。分佈式鎖提供了一種有效的機制來確保在分佈式環境中只有一個進程或線程能執行特定的操作。本文將探討在 Go 語言環境中實現分佈式鎖的原理和方法,包括使用 Redis 和 Etcd 作爲鎖的存儲後端,並提供實際的代碼示例。分佈式鎖的基本概念---------定義和用途分佈式鎖用於在不同的進程或系統間同步訪問共享資源。 它特別適用於分佈 ⌘ Read more
\\*1\\. 概述1.1 爲什麼學習二進制文件讀寫Go 語言內置了豐富的文件操作函數,可以很方便地處理文本文件。但對於音視頻、圖像等二進制文件,文本文件函數就不太適用了。學習 Go 語言的二進制文件讀寫操作,可以更高效地處理這些非文本文件,在實際項目中也很常用。1.2 Go 語言處理二進制文件的優勢Go 語言處理二進制文件具有以下優勢 1. 性能高,讀寫速度快 2. 支持跨平臺,代碼可以在多 ⌘ Read more*
\*1\. 概述1.1 爲什麼學習二進制文件讀寫Go 語言內置了豐富的文件操作函數,可以很方便地處理文本文件。但對於音視頻、圖像等二進制文件,文本文件函數就不太適用了。學習 Go 語言的二進制文件讀寫操作,可以更高效地處理這些非文本文件,在實際項目中也很常用。1.2 Go 語言處理二進制文件的優勢Go 語言處理二進制文件具有以下優勢 1. 性能高,讀寫速度快 2. 支持跨平臺,代碼可以在多 ⌘ Read more*
在 Go 語言中實現 WebSocket 的雙向通信通常需要使用第三方庫,其中 gorilla/websocket 是一個非常流行和廣泛使用的庫。以下是實現 WebSocket 雙向通信的步驟和簡單示例代碼:1 安裝 gorilla/websocket 庫:go get github.com/gorilla/websocket2 編寫 WebSocket 服務器:package mainimpor ⌘ Read more
概述--在本教程中,你將生成一個容器映像。該映像包括運行應用程序所需的一切:編譯的應用程序二進制文件、運行時、庫以及應用程序所需的所有其他資源。前置條件----若要完成本教程,需要滿足以下條件:golang 1.19+ 本地安裝了 docker Git 客戶端 程序--該應用程序提供兩個 HTTP endpoint:/ 返回符號 < 3 /health 返回 {"Statu ⌘ Read more
前言--本期將從 rpc 背景知識開始瞭解,如何安裝進行開發前的環境準備,protobuf 文件格式瞭解,客戶端服務端案例分享等,逐漸深入瞭解如何使用 grpc-go 框架進行實踐開發。背景知識瞭解------rpcrpc(Remote Procedure Call)遠程過程調用協議,採用的是客戶端 / 服務端模式,常用於微服務架構,通過網絡從遠程計算機上請求服務,而不需要了解底層網絡技術的協議, ⌘ Read more
事件驅動編程是一種編程範式,在這種範式下,程序的執行流由外部事件(如用戶操作、傳感器輸出或消息傳遞)來決定。在 Go 語言中,構建一個事件管理器可以幫助我們更好地組織和處理這些事件。本文將詳細探討如何在 Go 語言中創建和使用事件管理器,包括事件的定義、監聽和觸發,提供豐富的示例來指導你構建自己的事件驅動應用。Golang 事件管理器概述--------------事件驅動編程的優勢解耦:減少組件 ⌘ Read more
\\*1\\. Gob 簡介1.1 Gob 概述Gob(Go binary)是 Go 語言中用於序列化和反序列化數據的編碼庫。它是 Go 語言的標準庫之一,專門設計用於在 Go 程序之間高效地傳輸數據。Gob 可以將複雜的數據結構編碼成二進制格式,便於在不同系統之間傳遞,並支持版本控制和演進。1.2 爲什麼選擇 GobGob 相比其他序列化格式(如 JSON、XML)具有更高的性能和更小的數據體積。它是專 ⌘ Read more*
\*1\. Gob 簡介1.1 Gob 概述Gob(Go binary)是 Go 語言中用於序列化和反序列化數據的編碼庫。它是 Go 語言的標準庫之一,專門設計用於在 Go 程序之間高效地傳輸數據。Gob 可以將複雜的數據結構編碼成二進制格式,便於在不同系統之間傳遞,並支持版本控制和演進。1.2 爲什麼選擇 GobGob 相比其他序列化格式(如 JSON、XML)具有更高的性能和更小的數據體積。它是專 ⌘ Read more*
\\*概述XML(可擴展標記語言)作爲一種常見的數據交換格式,廣泛應用於配置文件、數據傳輸等場景。本文將介紹如何在 Go 語言 中進行 XML 文件的讀寫操作,涵蓋 XML 基礎知識、編碼 / 解碼基礎、讀取 XML 文件、寫入 XML 文件、實戰操作示例以及 XML 與 JSON 對比選型。一、XML 基礎知識簡介XML 語法結構XML 採用標籤(tag)來標記數據,具有自我描述性。一個基本的 XM ⌘ Read more*
\*概述XML(可擴展標記語言)作爲一種常見的數據交換格式,廣泛應用於配置文件、數據傳輸等場景。本文將介紹如何在 Go 語言 中進行 XML 文件的讀寫操作,涵蓋 XML 基礎知識、編碼 / 解碼基礎、讀取 XML 文件、寫入 XML 文件、實戰操作示例以及 XML 與 JSON 對比選型。一、XML 基礎知識簡介XML 語法結構XML 採用標籤(tag)來標記數據,具有自我描述性。一個基本的 XM ⌘ Read more*
今天要學習的是gorm.Scopes函數的使用。該函數的作用就是複用查詢條件。gorm Scopes 是什麼---------------在項目中,你一定會遇到過很多需要複用的查詢條件。比如常用的場景有分頁、查詢時判定數據權限等操作。比如,我們有兩個數據資源:用戶列表和部門列表。那麼,在查詢列表的時候都會涉及到分頁。當然可以在每個列表中都增加上列表相關的查詢。同時,也可以將分頁的查詢抽取出來,做成 ⌘ Read more
01 介紹在 Go 語言中,數組是一塊連續的內存,數組不可以擴容,數組在作爲參數傳遞時,屬於值傳遞。數組的長度和類型共同決定數組的類型,不同類型的數組之間不可以比較,否則在編譯時會報錯。因爲數組的一些特性,我們在 Go 項目開發中,很少使用數組。本文我們介紹一下數組的特性。02 數組聲明方式在 Go 語言中,數組的聲明方式有三種。示例代碼:func main() { var arr1 [2]int ⌘ Read more
\\*概述在 Go 語言中,JSON(JavaScript Object Notation)是一種常見的數據交換格式,用於在不同語言之間進行數據傳遞。本文將介紹 Go 語言中如何進行 JSON 文件的讀寫操作,包括解析與序列化,錯誤處理,以及一些實用技巧。一、JSON 文件基礎操作JSON 文件的讀取如何從 JSON 文件中讀取數據。package mainimport ( "encoding/js ⌘ Read more*
\*概述在 Go 語言中,JSON(JavaScript Object Notation)是一種常見的數據交換格式,用於在不同語言之間進行數據傳遞。本文將介紹 Go 語言中如何進行 JSON 文件的讀寫操作,包括解析與序列化,錯誤處理,以及一些實用技巧。一、JSON 文件基礎操作JSON 文件的讀取如何從 JSON 文件中讀取數據。package mainimport ( "encoding/js ⌘ Read more*
說起每個程序員必犯的錯誤,那還得是 "循環變量" 這個錯誤了,就連 Go 的開發者都犯過這個錯誤,這個錯誤在 Go 的 FAQ 中也有提到 What happens with closures running as goroutines?[1]:func main() { var wg sync.WaitGroup values := []string{"a", "b", "c"} ⌘ Read more=
基本在所有的編程語言中,都有 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=
\\*概述在 Go 語言中,反射是一項強大的特性,而 IsNil() 和 IsValid() 函數則是 reflect 包中兩個重要的函數,用於處理接口、通道、函數等各種類型。本文將深入介紹這兩個函數,解釋它們的用途、實際應用場景,並通過通俗易懂的例子更好地理解這兩個函數的神奇之處。一、IsNil() 函數判斷指針和接口是否爲 nilpackage mainimport ( "fmt" "refl ⌘ Read more*
\*概述在 Go 語言中,反射是一項強大的特性,而 IsNil() 和 IsValid() 函數則是 reflect 包中兩個重要的函數,用於處理接口、通道、函數等各種類型。本文將深入介紹這兩個函數,解釋它們的用途、實際應用場景,並通過通俗易懂的例子更好地理解這兩個函數的神奇之處。一、IsNil() 函數判斷指針和接口是否爲 nilpackage mainimport ( "fmt" "refl ⌘ Read more*
本文是 go-elasticsearch 庫的使用指南。go-elasticsearch 是 Elasticsearch 官方提供的 Go 客戶端。每個 Elasticsearch 版本會有一個對應的 go-elasticsearch 版本。官方會維護最近的兩個主要版本。go-elasticsearch 提供了 Low-level 和 Fully-typed 兩套 API。本文以 Fully-ty ⌘ Read more
\*概述Go 語言的反射機制賦予了動態調用函數的能力。本文將介紹如何通過反射調用函數,以及基本函數、帶參函數、帶返回值函數等多種場景。一、獲取函數的反射對象獲取函數的反射對象package mainimport ( "fmt" "reflect")// 定義一個示例函數func ExampleFunction(name string, age int) { fmt.Printf("Hello, ⌘ Read more*
\\*概述Go 語言的反射機制賦予了動態調用函數的能力。本文將介紹如何通過反射調用函數,以及基本函數、帶參函數、帶返回值函數等多種場景。一、獲取函數的反射對象獲取函數的反射對象package mainimport ( "fmt" "reflect")// 定義一個示例函數func ExampleFunction(name string, age int) { fmt.Printf("Hello, ⌘ Read more*
背景介紹在開發 Web 應用時我們常常需要寫 HTML 代碼以構建用戶界面。然而,創建和管理 HTML 模板可能會變得非常複雜和困難,特別是在大型項目中。要優化並整理這些模板代碼,我們需要一個強大且易於使用的模板語言。這種需求在使用 Go 語言開發 Web 應用時尤爲突出,因爲 Go 語言在內建支持的模板語言方面還不夠友好,尚有待提升。今天要給大家推薦一個 GitHub 開源項目 a-h/temp ⌘ Read more
\\*概述Go 語言的反射機制爲提供了一種強大的方式來檢查和修改變量的值。本文將介紹如何通過反射修改變量的值,包括基本類型、結構體、切片等各種場景。一、反射對象獲取變量的反射對象package mainimport ( "fmt" "reflect")func main() { // 定義一個整數變量 num := 42 // 使用reflect.ValueOf獲取反射對象 value : ⌘ Read more*=
\*概述Go 語言的反射機制爲提供了一種強大的方式來檢查和修改變量的值。本文將介紹如何通過反射修改變量的值,包括基本類型、結構體、切片等各種場景。一、反射對象獲取變量的反射對象package mainimport ( "fmt" "reflect")func main() { // 定義一個整數變量 num := 42 // 使用reflect.ValueOf獲取反射對象 value : ⌘ Read more*=
\\*概述Go 語言中,反射機制提供了強大的工具,其中的 reflect 包中的 ValueOf() 和 Value 函數是反射的基礎。本文將介紹這兩個函數的作用機制,探討其在接口值轉換、參數傳遞規律等方面的實際運用。一、ValueOf 函數作用機制package mainimport ( "fmt" "reflect")func main() { // 使用 ValueOf 獲取接口值的反射對 ⌘ Read more*
\*概述Go 語言中,反射機制提供了強大的工具,其中的 reflect 包中的 ValueOf() 和 Value 函數是反射的基礎。本文將介紹這兩個函數的作用機制,探討其在接口值轉換、參數傳遞規律等方面的實際運用。一、ValueOf 函數作用機制package mainimport ( "fmt" "reflect")func main() { // 使用 ValueOf 獲取接口值的反射對 ⌘ Read more*
在使用協程併發處理某些任務時, 其併發數量往往因爲各種因素的限制不能無限的增大. 例如網絡請求、數據庫查詢等等。從運行效率角度考慮,在相關服務可以負載的前提下(限制最大併發數),儘可能高的併發。在 Go 語言中,可以使用一些方法來控制協程(goroutine)的併發數量,以防止併發過多導致資源耗盡或性能下降。以下是一些常見的方法:1. 使用信號量(Semaphore):可以使用 Go 語言中的 c ⌘ Read more
大家好!我是 [lincyang]。今天我們要探討的是如何在 Go 語言中使用 Raft 算法來構建分佈式應用。什麼是 Raft 算法?------------Raft 算法是一種用於管理分佈式系統中的複製日誌的一致性算法。它的主要目標是簡化分佈式系統的構建和理解。爲什麼使用 Raft?-----------Raft 算法相對於其他分佈式一致性算法(如 Paxos)來說,更易於理解和實現,同時也具 ⌘ Read more
最近幾個月,沒事喜歡看看老外寫的技術文章,發現他們的一些思考維度真的有些不太一樣。當然,他們寫的文章大多數沒有國內的那麼卷。今天這篇文章是關於 Go 語言中接口設計的一些最佳實踐,與 Java 等語言不盡相似,但又帶着 Go 語言的特色,可以對照學習,拓展編程思想層面的認知面。以下是在 Go 中使用接口的一些最佳實踐:1、優先小接口:接口是 Go 中的強大工具,但要保持它們小巧並專注於特定任務。這 ⌘ Read more
\*概述結構體標籤,作爲 Go 語言中獨有的元信息機制,提供了在運行時對結構體字段進行註釋和標記的能力。本文將介紹 Go 語言中結構體標籤的概念、自定義創建和處理、應用場景、標籤信息查詢以及代碼生成場景應用,帶讀者深入瞭解結構體標籤的細節和最佳實踐。一、結構體標籤概念標籤定義和格式解析package mainimport ( "fmt" "reflect")// 定義一個包含標籤的結構體type ⌘ Read more*
\\*概述結構體標籤,作爲 Go 語言中獨有的元信息機制,提供了在運行時對結構體字段進行註釋和標記的能力。本文將介紹 Go 語言中結構體標籤的概念、自定義創建和處理、應用場景、標籤信息查詢以及代碼生成場景應用,帶讀者深入瞭解結構體標籤的細節和最佳實踐。一、結構體標籤概念標籤定義和格式解析package mainimport ( "fmt" "reflect")// 定義一個包含標籤的結構體type ⌘ Read more*
大家好!我是 [lincyang]。今天我們要探討的是 Go 語言中的事件驅動編程,特別是如何使用 EventBus 來實現這一目標。什麼是事件驅動編程?----------事件驅動編程是一種編程範式,其中應用程序的流程由外部事件(如用戶輸入或系統觸發的事件)來控制。這種方法在 GUI 應用、網絡編程和實時系統中尤爲常見。爲什麼選擇 EventBus?---------------EventBus ⌘ Read more
概述--在上一篇筆記記錄了 Gin 實現簡單的註冊登錄和狀態管理。這一篇筆記來分享一下如何將上面的項目打包鏡像和部署,筆記分成三部分,分別是 Web 後端項目 Docker 鏡像的構建、使用 Docker 運行、使用 Docker Compose 和 k8s 部署容器。使用 Ingress 路由規則和 Web 前端的部署運行在下一篇筆記中記錄。構建 Docker 鏡像------------概述構 ⌘ Read more
conc 使用指南conc 是由 sourcegraph 開源的一套友好的結構化併發工具包,其中總結了 sourcegraph 內部在編寫併發代碼時反覆遇到的問題的解決方案。conc.WaitGroup--------------conc 庫中的WaitGroup是作用域併發的主要構建塊。調用其Go方法能夠生成 goroutine,調用其Wait方法可以確保在生成的 goroutine 都退出後再 ⌘ Read more
\*概述Go 語言的反射機制提供了強大的工具,使得在運行時獲取結構體的成員類型成爲可能。本文將介紹如何用反射實現結構體成員類型的獲取,包括結構字段的遍歷、按名稱訪問結構成員、處理匿名字段及內嵌類型,以及解析字段標籤元信息的方法。一、結構字段遍歷值對象及類型對象package mainimport ( "fmt" "reflect")type User struct { ID int Na ⌘ Read more*
\\*概述Go 語言的反射機制提供了強大的工具,使得在運行時獲取結構體的成員類型成爲可能。本文將介紹如何用反射實現結構體成員類型的獲取,包括結構字段的遍歷、按名稱訪問結構成員、處理匿名字段及內嵌類型,以及解析字段標籤元信息的方法。一、結構字段遍歷值對象及類型對象package mainimport ( "fmt" "reflect")type User struct { ID int Na ⌘ Read more*
在當今應用開發領域,類似 OpenAI API 等生成式 AI 技術的蓬勃發展正在徹底改變着應用開發的格局。Python 和 JavaScript 等語言已經擁有豐富的資源來支持這些技術,其中 LangChain 就是一個顯著的例子。然而,Go 語言開發者面臨的選擇卻相對有限。LangChainGo,作爲 LangChain 的 Go 語言版本,一直在努力與 Go 的編程理念保持一致,而 Lang ⌘ Read more
\\*概述Go 語言中的反射機制提供了強大的工具,能夠在運行時獲取和操作變量的信息。其中,reflect.Elem() 方法是一個重要的利器,通過它能夠獲取指針指向的元素類型,提供更多的靈活性。本文將解析 reflect.Elem() 的方法簽名、作用機制,並通過豐富的示例演示其調用方式。一、Elem() 方法解析方法簽名func (v Value) Elem() ValueElem() 方法是 re ⌘ Read more*
\*概述Go 語言中的反射機制提供了強大的工具,能夠在運行時獲取和操作變量的信息。其中,reflect.Elem() 方法是一個重要的利器,通過它能夠獲取指針指向的元素類型,提供更多的靈活性。本文將解析 reflect.Elem() 的方法簽名、作用機制,並通過豐富的示例演示其調用方式。一、Elem() 方法解析方法簽名func (v Value) Elem() ValueElem() 方法是 re ⌘ Read more*
前言在[【你不知道的 websocket 協議,這次給你講明白!】](https://mp.weixin.qq.com/s?\\_biz=MzkxNjIyMDY4OQ==&mid=2247484242&idx=1&sn=ab1c7e2abe8aec98c92b19b215378f02&chksm=c1527d2cf625f43a634a116cf6856dc17d5956297452ce034f55c ⌘ Read more
前言在[【你不知道的 websocket 協議,這次給你講明白!】](https://mp.weixin.qq.com/s?\_biz=MzkxNjIyMDY4OQ==&mid=2247484242&idx=1&sn=ab1c7e2abe8aec98c92b19b215378f02&chksm=c1527d2cf625f43a634a116cf6856dc17d5956297452ce034f55c ⌘ Read more
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
\\*概述在 Go 語言中,反射是一項強大的特性,它允許程序在運行時動態獲取變量的類型信息,進行類型操作與轉換,甚至能夠對結構體和函數進行反射操作。本文將探討 reflect.TypeOf() 和 reflect.Type,揭示 Go 語言 中反射的奧祕。一、reflect.TypeOf() 函數返回反射 Type 對象reflect.TypeOf() 函數用於獲取一個變量的反射 Type 對象。它接 ⌘ Read more*
\*概述在 Go 語言中,反射是一項強大的特性,它允許程序在運行時動態獲取變量的類型信息,進行類型操作與轉換,甚至能夠對結構體和函數進行反射操作。本文將探討 reflect.TypeOf() 和 reflect.Type,揭示 Go 語言 中反射的奧祕。一、reflect.TypeOf() 函數返回反射 Type 對象reflect.TypeOf() 函數用於獲取一個變量的反射 Type 對象。它接 ⌘ Read more*
go tool fix 作用go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正爲新版本的代碼(這裏所說的版本是 Golang 的版本)。升級 Go 版本之後,使用這個命令可以自動對程序進行必要的更改。Golang 的演進過程中,對一些函數和標準庫進行改進是難免的,改進過程中有可能會出現兼容問題,一旦出現了兼容問題,從舊版本升級到新版本的代價 ⌘ Read more
在應用程序開發的不斷變化的景觀中,數據庫模式更改是不可避免的。GORM,強大的 Go 對象關係映射庫,通過遷移提供了一種無縫的解決方案來管理這些變化。本文將作爲您全面的指南,幫助您掌握使用 GORM 進行數據庫遷移和模式管理。我們將深入探討自動遷移、創建和應用遷移,以及在您的 Go 項目中優雅處理不斷髮展的模式需求的策略。GORM 中的自動遷移-----------自動遷移是一個重要的改進,確保您 ⌘ Read more
大家好,我是 陳明勇,一個熱愛技術,喜歡鑽研技術的程序員。前言在 Go 語言中使用 MongoDB 官方框架進行集合操作時,深深感到構建 bson 數據是一件非常繁瑣的工作。字段、逗號,括號等符號的排列,讓我感覺彷彿是在進行一場拼圖遊戲。因此我在想,有沒有一個能讓我絲滑,高效操作 MongoDB 的第三方框架呢,遺憾的是,並沒有找到符合我預期的框架,索性我就自己動手開發了一個,這就是 go-mon ⌘ Read more
在本文中,我們將全面深入地探討 Go 語言的反射機制。從反射的基礎概念、爲什麼需要反射,到如何在 Go 中實現反射,以及在高級編程場景如泛型編程和插件架構中的應用,本文爲您提供一站式的學習指南。一、簡介反射是一種讓程序在運行時自省(introspect)和修改自身結構和行爲的機制。雖然這聽起來有點像 “自我觀察”,但實際上,反射在許多現代編程語言中都是一個非常強大和重要的工具。Go 語言也不例 ⌘ Read more
Go 語言,也稱爲 Golang,是一種爲構建高效、可靠和可擴展軟件而設計的開源編程語言。它於 2007 年在 Google 開發,現在廣泛用於開發 Web 應用程序、網絡工具和系統軟件。爲什麼使用基於 Go 的 CMS 解決方案?----------------------這些優勢使 Go 成爲開發可擴展、高性能應用程序的熱門選擇。在使用 Go 構建基於 Web 的解決方案時,其速度是其中一個主 ⌘ Read more
什麼叫做跨域 "跨域" 是一個網絡安全的概念,起源於瀏覽器的同源策略。同源策略是一種約定,它是由網景(Netscape)公司提出的一個重要的安全策略。所謂同源是指 "協議 + 域名 + 端口號" 三者相同,只要不同時,就算是不同源。 換句話說,"跨域" 指的是從一個域名的網頁去請求另一個域名的資源。例如,"http://website1.com" 的網頁通過 Ajax 獲取 "http ⌘ Read more
\\*概述Telnet 迴音服務器是一個簡單而實用的網絡應用,通過 Telnet 協議連接,用戶輸入什麼,服務器就回顯什麼。本文將介紹如何使用 Go 語言創建一個 Telnet 迴音服務器,通過完整的示例代碼和詳細註釋,便於理解 TCP 服務器的基本結構和實現。1. TCP 服務器基礎TCP 協議簡介package mainimport ("fmt""net")func main() { liste ⌘ Read more*