瞭解 Golang 中的內存管理:Stack vs Heap
內存管理是編程的一個重要方面,瞭解內存管理的工作原理會極大地影響應用程序的性能和效率。在 Golang 中,內存分配主要通過兩個區域進行管理:棧和堆。在本文中,我們將探討堆棧和堆內存的區別、Golang 如何處理這些分配,並提供實際示例來說明這些概念。Stack堆棧是什麼?堆棧是以後進先出(LIFO)方式運行的內存區域。它用於存儲局部變量和函數調用信息,如返回地址、參數和局部變量。堆棧因其後進先出 ⌘ Read more
你知道 golang 中 sysmon 有什麼作用嗎?
在 Go 語言的運行時 (runtime 包) 中,sysmon 是一個系統監視器 (system monitor) 線程,它在 Go 運行時中扮演着非常重要的角色。sysmon 的主要職責是維護 Go 程序的健壯性和響應性,確保垃圾回收 (Garbage Collection, GC)、搶佔調度 (Preemptive Scheduling)、定時器 (Timers) 和一些其他後臺任務能夠及時 ⌘ Read more
Golang 高併發應用中的數據庫連接死鎖
在構建高併發的 Go 應用時, 數據庫連接池的使用是不可或缺的。然而, 如果使用不當, 連接池也可能成爲性能瓶頸, 甚至導致整個應用陷入死鎖。本文將深入探討 Golang 中數據庫連接死鎖的原因、影響以及解決方案, 幫助開發者構建更加健壯的應用程序。數據庫連接池的工作原理———–在深入討論連接死鎖之前, 我們需要先了解數據庫連接池的工作原理。連接池本質上是一個連接的緩存, 它可以避免 ⌘ Read more
from my understanding.. i don’t know how the multiplexing works when its being proxied through another server. I know go has support for it if you call it out directly. https://pkg.go.dev/golang.org/x/net/http2
一文搞定 Golang 反射 -Reflect-
Go (Golang) 中的反射是一項強大的功能,它允許程序在運行時檢查自身的結構和值。這一功能由 reflect 包提供。反射通常用於序列化 / 反序列化、構建泛型庫和測試等任務。本文將概述反射在 Go 中的工作原理,並提供實際示例。基本概念Type: 值的類型,(如 int、string、float、struct)。 Value: 變量的實際數據。 kind: 類型的具體類別(如 ⌘ Read more
@movq@www.uninformativ.de If it still existed I bet the first thing he’d do is convert it to Golang 👌🤣
golang 做 api 開發離不開簽名驗證- 如何設計?
在 API 開發中,簽名驗證是一種常見的安全措施,用於確保請求的完整性和來源的可靠性。以下是設計一個簽名驗證機制的步驟和示例代碼。設計思路密鑰管理:爲每個客戶端分配一個唯一的 API 密鑰和 API 密鑰。 簽名生成:客戶端在請求 API 時,使用預定義的算法生成簽名,並將簽名和其他必要參數(如時間戳、隨機數等)一起發送到服務器。 簽名驗證:服務器接收到請求後,根據相同的算法重新生成簽 ⌘ Read more
在 golang 裏使用 ZooKeeper,如何使用
在 Go 語言中使用 ZooKeeper,可以藉助第三方庫go-zookeeper。下面介紹如何安裝和使用這個庫與 ZooKeeper 進行交互。安裝 go-zookeeper 庫首先,需要安裝go-zookeeper庫。使用go get命令來安裝:go get github.com/samuel/go-zookeeper/zk使用 ZooKeeper 的基本示例以下是一個簡單的示例,包括連接 Z ⌘ Read more
Go 語言定時任務 time-Sleep 和 time-Tick 的優劣對比分析
golang 寫循環執行的定時任務,常見的有以下三種實現方式 1、time.Sleep 方法:for { time.Sleep(time.Second) fmt.Println(“我在定時執行任務”)}2、time.Tick 函數:t1:=time.Tick(3time.Second)for { select { case <-t1: fmt.Println(“t1定時 ⌘ Read more
Golang - range 迭代器揭祕
簡介我們正在使用 Go 語言編寫 Dolt[1] ,這是世界上第一個版本控制的 SQL 數據庫。像大多數大型 Go 代碼庫一樣,我們有很多需要迭代的集合類型。 Go 1.23 的新特性 [2] 中,你現在可以使用 range 關鍵字來迭代自定義集合類型。這是如何工作的? 這是個好主意嗎? 讓我們深入探討一下。如果你想運行本教程中的任何代碼,你需要 安裝 Go 1.23 發佈候選版 [3] ,或者在 ⌘ Read more
Golang 面試題:原子操作和鎖
1、問題描述原子操作和鎖的區別是什麼?2、問題解答原子操作和鎖是併發編程中常用的兩種同步機制,它們的區別如下:1、作用範圍:原子操作(Atomic Operations):原子操作是一種基本的操作,可以在單個指令級別上執行,保證操作的原子性。原子操作通常用於對共享變量進行讀取、寫入或修改等操作,以確保操作的完整性。 鎖(Lock):鎖是一種更高級別的同步機制,用於保護臨界區(Critical ⌘ Read more
構建並運行 eBPF 應用 - Part 2
在上一篇文章中,我們用 C 語言創建了一個 eBPF 程序,以瞭解某個進程使用 CPU 的時間。這些數據隨後被存儲在 BPF HashMap 中。但這是一個不斷更新的短期存儲位置,數據的壽命很短…… 我們該如何利用這些數據呢?這就是用戶空間程序的用武之地。用戶空間程序不在內核空間運行,但可以附加到 eBPF 程序並訪問 BPF HashMap。現在讓我們來看看如何用 Golang 編寫用戶 ⌘ Read more
Golang 實現坦克世界
Golang 實現坦克世界項目地址: https://github.com/gofish2020/tankgame 歡迎 Fork && Star遊戲效果—-本項目基於遊戲引擎 Ebitengine 開發,這裏有很多的實例 https://ebiten-zh.vercel.app/examples/ 便於邊學邊用程序下載到本地,直接 go run main.go即可看效果。開發使用的go1.2 ⌘ Read more
理解並使用 Golang 的 “omitempty” 特性
在使用 Go (Golang) 並將數據編碼爲 JSON 時,您可能會遇到這樣的情況:如果某些字段的值爲空,則需要從編碼輸出中省略這些字段。這就是 Golang 的 omitempty 功能發揮作用的地方。struct 字段標記中的 omitempty 選項會告訴編碼器,如果字段爲空值,則跳過該字段。什麼是 “Empty Value”?在 Go 中,Empty Value 的定義是:布爾類型爲 ⌘ Read more
構建並運行 eBPF 應用 - Part 1
本文將介紹如何使用 C 和 Golang 編寫第一個 eBPF 程序。我們將在第一部分介紹實際的 eBPF 程序,在第二部分介紹用戶空間應用程序。準備工作本文開發所運行的操作系統是:OS: Ubuntu 22.04Linux Header Version: 6.5.0–14-generic還通過 apt 安裝了一些依賴項:sudo apt-get -y install libbpf bpfcc-t ⌘ Read more
Gaby - Golang 社區機器人
Gaby 是一個實驗性的新機器人, 在 Go 問題跟蹤器中以 @gabyhelp[1] 的身份運行, 試圖自動化各種機器可以合理完成的瑣碎事務, 同時也試圖發現機器可以合理完成的新事物。gaby 這個名字是 “Go AI Bot” 的縮寫, 因爲這個實驗的目的之一是瞭解 LLM 可以有效用於哪些方面, 包括識別它們不應該用於哪些方面。一些 gaby 功能將涉及 LLM; 其他功能則不會。指導原則是 ⌘ Read more
以 Go 語言爲例解釋什麼是僞共享以及如何解決
本文翻譯自:What’s false sharing and how to solve it (using Golang as example)譯文在解釋僞共享(false sharing)之前,有必要簡要介紹一下 CPU 架構中緩存是如何工作的。CPU 緩存中的最小單位是緩存行(cache line)(如今,CPU 中常見的緩存行大小爲 64 字節)。因此,當 CPU 從內存讀取一個變量時, ⌘ Read more
Golang 編寫範型集合,官方文檔未提及的訣竅
引言–Go 的泛型功能在 Go 1.18 版本中發佈, 至今已有兩年多了。我們正在使用 Go 開發 Dolt[1] , 這是世界上第一個支持版本控制的 SQL 數據庫。儘管我們有數十萬行 Go 代碼, 但我們並沒有大量使用泛型。我們在一些地方使用泛型 來加速代碼中的高流量部分 [2] , 但總的來說, 除了 slices[3] 和 maps[4] 包中的一些有用的庫方法外, 我們還沒有找到使用泛 ⌘ Read more
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
NeoVim 打造成跟 Goland 一樣好用的 IDE
在軟件開發領域,集成開發環境(IDE)的選擇對程序員的效率和生產力起着舉足輕重的作用。對於尋求精簡而強大的編碼體驗的 Golang 開發者來說,配置 Neovim 是一個不錯的選擇。本文分享完整的 Golang NeoVim 的設置,幫助你將 NeoVim 打造成媲美 Goland 的開發環境。初始設置將以下內容添加到 .vimrc 或 init.vim 文件中。set expandtabset ⌘ Read more
Golang Context 內部原理一覽
context[1] 包是每個 Go 語言程序員在編程生涯中都會使用到的, 但你們真的瞭解它的內部工作原理嗎 (因爲據說真正的美麗都藏在內在)? 如果你對此感興趣, 可以查看我之前關於 sync.WaitGroup 內部工作原理的博文 鏈接 [2] 。本文旨在簡要概覽內部工作原理, 因此我會適當簡化一些細節。如果你想查看全部的實現細節, 或者你更喜歡直接閱讀源代碼而不是博客, 可以 點擊這裏 ⌘ Read more
Go singlefight 源碼詳解
寫在前面 通俗的來說就是 singleflight 將相同的併發請求合併成一個請求,進而減少對下層服務的壓力,通常用於解決緩存擊穿的問題。詳解基礎結構—-golang.org/x/sync/singleflight singleflight 結構體:type call struct { wg sync.WaitGroup // 這些字段在 WaitGroup 結束前寫入一次 // 只有在 W ⌘ Read more
使用 Golang 開發 eBPF 的應用
大多數時候, 我們在開發軟件或使用軟件時, 都在操作系統的安全邊界內運行。我們甚至不知道 IP 數據包是如何從網絡接口被接收的, 或者當我們保存文件時, inode 是如何被文件系統處理的。這個邊界被稱爲用戶空間, 我們在這裏編寫應用程序、庫和工具。但還有另一個世界, 即內核空間。操作系統內核就駐留在這裏, 負責管理系統資源, 如內存、CPU 和 I/O 設備。通常我們不需要深入到 socket ⌘ Read more
10 分鐘瞭解 Golang 泛型
泛型是 Golang 在 1.18 版本引入的強大工具,能夠幫助我們在合適的場合實現簡潔、可讀、可維護的代碼。原文: Go Generics: Everything You Need To Know[1]導言可能有人會覺得 Go 泛型很難,因此想要借鑑其他語言(比如 Java、NodeJS)的泛型實踐。事實上 Go 泛型很容易學,本文希望能幫助讀者更好的理解 Go 泛型。 👉注:本文不會將 ⌘ Read more
GO 語言學習筆記: 垃圾回收機制剖析
一、引言—-(一)垃圾回收 概述垃圾回收(Garbage Collection,GC) 是 Go 語言的核心特性之一,是實現內存自動管理的一種形式。golang 的自動垃圾回收屏蔽了複雜且容易出錯的內存操作,讓開發變得更加簡單、高效。在 Go 語言中,從實現機制上來說,垃圾回收可能是最複雜的模塊了。瞭解垃圾回收的機制,有助於更好地理解 Go 語言的內存管理機制,從而更好的使用 Go 語言進行開 ⌘ Read more
使用 Golang 構建你的第一個 k8s Operator
本文將展示如何使用 Operator SDK[1] 搭建一個基本的 k8s Operator。在本文中,您將瞭解如何創建一個新項目,並通過創建自定義資源定義 (CRD) 和基本控制器來添加 API。我們將在 CRD 中添加字段,以包含一些有關期望狀態和實際狀態的信息,修改控制器以調和新資源的實例,然後將 operator 部署到 Kubernetes 集羣。Prerequisites安裝 Oper ⌘ Read more
快速喫透 Golang Channels 使用技巧
Golang 可以通過啓動 goroutines 來併發執行任務。它們可以通過一種名爲 “通道” 的通信媒介相互通信。話不多說,下面我列舉了幾種不同情況下 channel 的使用以及其適用條件,最後總結出一張 channel table,能夠幫助你快速喫透 channel 的所有要點。Let’t go!Nil Channels如果你像創建普通變量一樣創建一個通道,通道將被初始化爲零值。這裏要提到的 ⌘ 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 實驗室:image 圖像處理就用它
短腿子猿的 Go 實驗室,Golang 官方提供了很多 package 來幫助大家提高開發的效率,但是由於函數太多,經常會記不住,這裏開了一個專題來分享官方 package,努力做到每週一更 Golang 中的 image 包提供了基本的圖像類型、顏色模型、以及用於處理圖像的各種函數和接口。以下是一些常用的函數和接口,以及相應的示例。常用類型與接口——-image.Image 接口這是 ⌘ 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
實現微服務註冊的高效利器: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
Golang 中 JSON 操作的 5 個常見陷阱(建議收藏!)
JSON 是許多開發人員在工作中經常使用的一種數據格式。它一般用於配置文件或網絡數據傳輸等場景。由於其簡單、易懂、可讀性好,JSON 已成爲整個 IT 界最常用的格式之一。對於這種情況,Golang 和許多其他語言一樣,也提供了標準庫級別的支持, encoding/json[1]。就像 JSON 本身很容易理解一樣,用於操作 JSON 的編碼 / JSON 庫也非常容易使用。但我相信,很多開發者可 ⌘ Read more
Golang 實現搜索引擎
概述–主要包括三個部分:網絡爬蟲: 爬取儘可能多的網頁; 網頁分詞: 利用jieba庫對網頁內容進行分詞, 並存儲分詞結果(格式爲: 文檔 id, 文檔長度, 詞頻, 分詞偏移 - 文檔 id, 文檔長度, 詞頻, 分詞偏移); 搜索頁面: 提供一個前端頁面, 用戶輸入搜索詞, 基於分詞相關性, 返回結果; 不要害怕,整個邏輯很簡單,邏輯拆分的很獨立,便於理解。項目地址: ht ⌘ Read more
Golang 狀態機設計模式
本文介紹了 Golang 狀態機模式的一個實現示例,通過該模式,可以解耦調用鏈,有助於實現測試友好的代碼,提高代碼質量。原文: Go State Machine Patterns[1]導言在我們開發的許多項目中,都需要依賴某種運行狀態從而實現連續操作。這方面的例子包括:解析配置語言、編程語言等 在系統、路由器、集羣上執行操作… ETL(Extract Transform Loa ⌘ 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
C 語言竟可以調用 Go 語言函數,這是如何實現的?
大家好,我是飛哥!今天和大家聊一個問題,一門語言是否可以在同一個進程內調用另外一門語言實現的函數?例如 C 語言是否可以調用 Golang 實現的函數?注意我說的是同進程內調用,跨進程的 IPC、PRC 之類的技術不算。直接拋出這個問題的答案,同進程跨語言調用是可行的。在各種語言設計時,爲了複用其它語言生態中積累下來的大量的代碼資產,都會實現跨語言調用的機制。例如在 Golang 中,實現了 cg ⌘ Read more
gojq:現代 Golang JSON 查詢神器
隨着現代應用程序對數據處理和解析需求的不斷增加,JSON 已成爲數據交換的主要格式之一。在 Golang 生態系統中,解析和操作 JSON 數據的工具層出不窮,而 gojq 則是其中一款功能強大且易於使用的 JSON 查詢工具。本文將深入解析 gojq,展示其強大功能和實際應用場景,並通過豐富的示例幫助讀者全面掌握這款利器。什麼是 gojq?———gojq 是一個用 Go 語言編寫的 ⌘ Read more
Gone 一個基於 Golang 的輕量級依賴注入框架
Gone 一個基於 Golang 的輕量級依賴注入框架Gone 首先是一個輕量的,基於 Golang 的,依賴注入框架,靈感來源於 Java 中的 Spring Framework;其次,Gone 框架中包含了一系列內置組件,通過這些組件提供一整套 Web 開發方案,提供服務配置、日誌追蹤、服務調用、數據庫訪問、消息中間件等微服務常用能力。文檔https://goner.fun/zh/ ht ⌘ 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
Cloudflare 最佳實踐:如何通過 Go PGO 回收 CPU
Golang 1.20 在 go 編譯器引入了對配置文件引導優化 (PGO) 的支持。這允許指導編譯器根據系統的真實行爲引入優化。在 Cloudflare 的可觀察性團隊中,我們維護着一些基於 Go 的服務,這些服務在全球範圍內使用數千個內核,因此,即使宣傳的節省 2-7%,也能大幅減少我們的 CPU 佔用空間,而且實際上是免費的。這將減少我們內部服務的 CPU 使用率,釋放這些資源來滿足客戶請求 ⌘ Read more
使用 OpenTelemetry 實現 Golang 服務的可觀測系統
這篇文章中我們會討論可觀測性概念,並瞭解了有關 OpenTelemetry 的一些細節,然後會在 Golang 服務中對接 OpenTelemetry 實現分佈式系統可觀測性。Test Project我們將使用 Go 1.22 開發我們的測試服務。我們將構建一個 API,返回服務的名稱及其版本。我們將把我們的項目分成兩個簡單的文件(main.go 和 info.go)。// file: main. ⌘ Read more
Golang 實現異步隊列
源代碼已託管至 Github: https://github.com/gofish2020/easyqueue爲什麼需要異步隊列?———-在高併發系統中,如果同時有大量的請求 / 任務需要進行處理,由於系統的負載能力有限,一次性能夠同時處理的請求 / 任務是有限的。那麼這些任務就需要進行排隊,先來的先處理,後來的後處理。如果超過了整個隊列能夠容納的請求 / 任務,那麼後續的請求 / 任 ⌘ Read more
Golang 高效處理集合 -Collection- 的庫
處理集合是構建任何應用程序的重要部分。通常,需要以下幾類操作:轉換:將某個函數應用於集合中的每個元素,以創建一個新類型的新集合; 過濾:選擇滿足特定條件的集合中的元素; 聚合:從集合中計算出單個結果,通常用於彙總; 排序 / 排序:根據某些標準重新排列集合的元素; 訪問:根據其屬性或位置檢索元素的操作; 實用程序:與集合一起工作的通用操作,但不一定完全適合上述分類。 ⌘ Read more
Golang 實現枚舉的多種方式及最佳實踐
枚舉提供了一種表示一組命名常量的方式。雖然 Go 語言沒有內置的枚舉類型,但開發者可以通過常量 / 自定義類型來模擬類似枚舉的行爲。枚舉在編程語言中扮演着至關重要的角色,提供了一種簡潔而富有表現力的方式來定義一組命名常量。雖然像 Java 或 C# 這樣的語言提供了對枚舉的內置支持,但 Go 採用了不同的方法。在 Go 中,枚舉並不是一種原生的語言特性,但開發者有幾種技術可供使用,以實現類似的功能 ⌘ Read more
Golang 如何實現自定義 CDC 工具?
CDC變更數據捕獲(CDC)是一種跟蹤數據庫更改的技術,允許開發人員捕獲應用於行的插入、更新和刪除。它是數據集成和實時處理任務的重要組成部分。在本文中,我們將討論如何在 Golang 中爲 PostgreSQL、Oracle、MySQL、MongoDB 和 SQL Server 等多個數據庫開發自定義 CDC 工具。通常在 CDC 領域或者說大數據領域都是 java 的生態比較繁榮,比如 Flin ⌘ Read more