RAII,全稱資源獲取即初始化(英語:Resource Acquisition Is Initialization),它是在一些面嚮對象語言中的一種慣用法。RAII 源於 C++,在 Java,C#,D,Ada,Vala 和 Rust 中也有應用。1984-1989 年期間,比雅尼 · 斯特勞斯特魯普和安德魯 · 柯尼希在設計 C++ 異常時,爲解決資源管理時的異常安全性而使用了該用法,後來比雅尼 ⌘ Read more
RAII,全稱資源獲取即初始化(英語:Resource Acquisition Is Initialization),它是在一些面嚮對象語言中的一種慣用法。RAII 源於 C++,在 Java,C#,D,Ada,Vala 和 Rust 中也有應用。1984-1989 年期間,比雅尼 · 斯特勞斯特魯普和安德魯 · 柯尼希在設計 C++ 異常時,爲解決資源管理時的異常安全性而使用了該用法,後來比雅尼 ⌘ Read more
介紹------設計模式通常被認爲是每個優秀軟件工程師都應該具備的基礎知識,這麼說可能沒問題。然而,並不是所有的理論知識都對日常工作有用。我不確定設計模式是否適用於我在大型基於微服務的代碼庫中的日常工作,這些微服務爲數百萬用戶提供服務,所以我決定調查一下。我的目的並不是描述所有經典的軟件設計模式。我專注於我經常注意到的前 3 種設計模式。我將解釋每種模式解決的具體現實問題。設計模式的簡史----- ⌘ Read more
當向切片添加新參數時,底層數組會發生什麼變化?它會擴展以容納更多元素嗎?在這篇文章中,我們將深入探討切片的內部工作原理,以及如何利用這些知識來進行更好的內存管理和性能優化。具體而言,我們將探索 Go 中切片的底層實現和內存管理機制。讓我們開始吧!查看數組要深入瞭解切片的結構,必須仔細查看其底層類型:數組。func main() { a := [5]int{} fmt.Printf( ⌘ Read more=
在分佈式系統中,由於各個節點之間無法直接共享內存,通常使用分佈式共享內存的方式來實現數據共享。在 Go 語言中,可以通過一些中間件和數據存儲服務來實現分佈式共享內存。下面我將介紹兩種常用的方法:使用 Redis 和使用 etcd。使用 Redis 實現分佈式共享內存: Redis 是一種高性能的鍵值對存儲數據庫,可以用於實現分佈式共享內存。在 Go 語言中,可以使用github.com/go-r ⌘ Read more
二叉樹是一種常見並且非常重要的數據結構,在很多項目中都能看到二叉樹的身影。它有很多變種,比如紅黑樹,常被用作 std::map 和 std::set 的底層實現;B 樹和 B+ 樹,廣泛應用於數據庫系統中。本文要介紹的二叉搜索樹用的也很多,比如在開源項目 go-zero 中,就被用來做路由管理。這篇文章也算是一篇前導文章,介紹一些必備知識,下一篇再來介紹具體在 go-zero 中的應用。二叉搜索樹 ⌘ Read more
一、前言golang 中的鎖分爲互斥鎖、讀寫鎖、原子鎖即原子操作。在 Golang 裏有專門的方法來實現鎖,就是 sync 包,這個包有兩個很重要的鎖類型。一個叫 Mutex, 利用它可以實現互斥鎖。一個叫 RWMutex,利用它可以實現讀寫鎖。基本遵循兩大原則:1、可以隨便讀,多個 goroutine 同時讀2、寫的時候,啥也不能幹。不能讀也不能寫讀鎖的時候無需等待讀鎖的結束 讀鎖的時候要 ⌘ Read more
Go 語言作爲一門靜態編譯型語言, 編譯和運行是我們開發過程中經常要用到的功能。本文將深入介紹 Go 語言程序的編譯和運行機制, 包括編譯器工作原理、編譯命令使用、交叉編譯設置、運行方式、編譯錯誤分析等多個方面, 希望可以幫助大家全面瞭解 Go 語言的編譯和運行。Go 語言的編譯器Go 語言自帶了官方的編譯器和鏈接器, 安裝 Go 語言環境時就已經包含了編譯工具。我們使用的 go build、go ⌘ Read more
其實很多人不知道,責任鏈模式是我們工作中經常遇到的模式,特別是 web 後端工程師,我們工作中每時每刻都在用:因爲市面上大部分的 web 框架的過濾器基本都是基於這個設計模式爲基本模式搭建的。模式介紹-------我們先來看一下責任鏈模式(Chain Of Responsibility Design Pattern )的英文介紹:Avoid coupling the sender of a req ⌘ Read more
這篇文章,我們來了解下 go-queue/kq (kafka)。消息隊列對於大型微服務系統是必不可少的,主要是用來解決削峯、降低服務之間的耦合度以及異步能力。 Kafka, Beanstalkd Pub/Sub framework. https://github.com/zeromicro/go-queue/02 概述Apache Kafka 是一個快速、可擴展的、高吞吐、可容錯的分佈式發 ⌘ Read more
對象池(object pool pattern)是一種設計模式。一個對象池包含一組已經初始化過且可以使用的對象,而可以在有需求時創建和銷燬對象。池的用戶可以從池子中取得對象,對其進行操作處理,並在不需要時歸還給池子而非直接銷燬它。這是一種特殊的工廠對象。若初始化、實例化的代價高,且有需求需要經常實例化,但每次實例化的數量較少的情況下,使用對象池可以獲得顯著的效能提升。從池子中取得對象的時間是可預測 ⌘ Read more
原型模式是創建型模式的一種,其特點在於通過 “複製” 一個已經存在的實例來返回新的實例, 而不是新建實例。被複制的實例就是我們所稱的“原型”,這個原型是可定製的。如果你有一個對象, 並希望生成與其完全相同或者類似的一個複製品, 你該如何實現呢? 首先, 你必須新建一個屬於相同類的對象,或者類似的對象, 然後你必須遍歷原始對象的所有成員變量, 並將成員變量值複製到新對象中。在 Go 生態 ⌘ Read more
作者:Ciusyan https://juejin.cn/post/7244809769794207801空結構體與內存對齊爲什麼需要結構體?---------在 Go 語言中,使用整型、字符串、浮點型等基本的數據類型,就可以表示很多事物了。那麼爲什麼還需要結構體呢?使用結構體,可以更方便的抽象出一組具有相同行爲和屬性的事物。那結構體是什麼呢?結構體是 Go 語言中的一種自定義類型,它可 ⌘ Read more
題圖來自 Understand Compile Time && Runtime! Improving Golang Performance(1)[1]以下內容,是對 運行時 runtime 的神奇用法 [2] 的學習與記錄 目錄:1. 獲取 GOROOT 環境變量 2. 獲取 GO 的版本號 3. 獲取本機 CPU 個數 4. 設置最大可同時執行的最大 CPU 數 5 ⌘ Read more
關於日誌的一些問題:單個文件過大會影響寫入效率,所以會做拆分,但是到多大拆分? 最多保留幾個日誌文件?最多保留多少天,要不要做壓縮處理?一般都使用 lumberjack[1] 這個庫完成上述這些操作 lumberjack---------- //info文件writeSyncer infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Log ⌘ Read more=
概述--Go 語言自帶的 pprof 是一種性能分析工具,用於幫助開發者分析和優化程序的性能,它可以提供關於 CPU 耗時、內存分配、網絡 IO、系統調用、阻塞等待等方面的詳細信息。快速開始----我們來通過一個小例子直觀的感受下 pprof 的使用方法,本文所有示例代碼運行環境是 go1.20 darwin/arm64。示例程序package mainimport ( "bytes" "log" ⌘ Read more
今天介紹一款非常實用的併發工具庫來自公司 sourcegraph 的 conc[1] 併發庫,目標是 better structured concurrency for go, 簡單的評價一下每個公司都有類似的輪子,與以往的庫比起來,多了泛型,代碼寫起來更優雅,不需要 interface, 不需要運行時 assert, 性能肯定更好我們在寫通用庫和框架的時候,都有一個原則,併發控制與業務邏 ⌘ Read more
OpenTelemetry-------------Opentelemetry 是一個 CNCF 社區下一個開源的可觀測性框架,或者也可以說是一組工具、API 和 SDK 的集合,來檢測、生成、收集和導出可觀測性數據(指標、日誌和鏈路),以幫助我們分析軟件的性能和行爲。優點過去,檢測代碼的方式會有所不同,因爲每個可觀測性後端都有自己的檢測庫和代理,用於向工具發送數據。這意味着沒有用於將數據發送到可 ⌘ Read more
一、前言Go 語言中的反射是由 reflect 包提供支持的,它定義了兩個重要的類型 Type 和 Value 。任意值在反射中都可以理解爲由 reflect.Type 和 reflect.Value 兩部分組成,並且 reflect 包提供了 reflect.TypeOf 和 reflect.ValueOf 兩個函數來獲取任意對象的 Value 和 Type。在 Go 語言程序中,使用 refl ⌘ Read more
Apache Arrow 是一種開放的、與語言無關的列式內存格式,在本系列文章 1] 的前幾篇中,我們都聚焦於[內存表示 2] 與[內存操作 [3]。但對於一個數據庫系統或大數據分析平臺來說,數據不能也無法一直放在內存中,雖說目前內存很大也足夠便宜了,但其易失性也決定了我們在特定時刻還是要將數據序列化後存儲到磁盤或一些低成本的存儲服務上 (比如 AWS 的 S3 等)。那麼將 Arrow 序列化成 ⌘ Read more
概述--Go 語言在併發編程方面有強大的能力,這離不開語言層面對併發編程的支持。本節會介紹 Go 語言運行時調度器的實現原理,其中包含調度器的設計與實現原理、演變過程以及與運行時調度相關的數據結構。談到 Go 語言調度器,我們繞不開的是操作系統、進程與線程這些概念,線程是操作系統調度時的最基本單元,而 Linux 在調度器並不區分進程和線程的調度,它們在不同操作系統上也有不同的實現,但是在大多數的 ⌘ Read more
01 介紹進程是一個可執行程序在運行時的一塊獨立的虛擬內存 [1] 空間,Linux 給每個進程分配一個虛擬內存空間,包括棧空間、未使用內存、堆空間、BSS、DATA、TEXT 等。線程可以理解爲輕量級進程,多個線程 “寄生” 在一個進程中,每個線程有獨立的棧空間,其它虛擬內存空間,多個線程共享,所以線程之間通信比較簡單,也就是說線程之間可以通過共享內存通信。進程和線程都是 CPU 的一個執行單元 ⌘ Read more
在面向對象編程語言中,單例模式 (Singleton pattern) 確保一個類只有一個實例,並提供對該實例的全局訪問。那麼 Go 語言中,單例模式確認一個類型只有一個實例,並提供對該實例的全局訪問,一般就是直接訪問全局變量即可。比如 Go 標準庫中的os.Stdin、os.Stdout、os.Stderr分別代表標準輸入、標準輸出和標準錯誤輸出。它們是os.File類型的全局變量,可以在程序中 ⌘ Read more
隨着 Go 1.19 的發佈,Go 語言團隊升級 sync/atomic, 在其中加入了 atomic.PointerT] 的新類型,也是第一個作爲全新 API 加入標準庫,支持泛型的數據類型,受到 Go 社區用戶的關注。同時,官方在 [Release Notes 中,也提及到這個 API 的加入,使得原子值使用更加簡單。特徵--atomic.Pointer 是泛型類。與 atomic.Value ⌘ [Read more](https://www.readfog.com/a/1708593111412871168)
題目描述 LFUCache(int capacity) - 用數據結構的容量 capacity 初始化對象 int get(int key) - 如果鍵 key 存在於緩存中,則獲取鍵的值,否則返回 -1 void put(int key, int value) - 如果鍵 key 已存在,則變更其值;如果鍵不存在,請插入鍵值對。當緩存達到其容量 capacity 時,則應該在 ⌘ Read more
官網地址:https://gitee.com/dreamans/syncd/issuessyncd 是一款開源的代碼部署工具,它具有簡單、高效、易用等特點,可以提高團隊的工作效率. 目前只支持類 Linux 系統.特性 Go 語言開發,編譯簡單、運行高效 Web 界面訪問,交互友好 靈活的角色權限配置 支持 Git 倉庫 分支、tag 上線 部署 hook 支持 ⌘ Read more
Part1Go Mutex 的基本用法Mutex 我們一般只會用到它的兩個方法:Lock:獲取互斥鎖。(只會有一個協程可以獲取到鎖,通常用在臨界區開始的地方。) Unlock: 釋放互斥鎖。(釋放獲取到的鎖,通常用在臨界區結束的地方。) Mutex 的模型可以用下圖表示:Go Mutex 模型. png說明:同一時刻只能有一個協程獲取到 Mutex 的使用權,其他協程需要排隊等待(也就 ⌘ Read more
Go 1.21 再有兩三個月就發佈了,很多同學都已經總結了 Go 1.21 的新特性了,爲新的 Go 版本的到來造勢,但是我還沒看到有同學專門介紹 Go 1.21 爲網絡庫新增加的一個特性,所以我專門新開一篇專門來介紹。關於 MPTCP 這個新特性,專門有一個 issue (#56539[1]) 跟進和討論。它是一個對 TCP 的單路徑的擴展,由 RFC8684[2] 規範來定義。多路徑傳輸控制協 ⌘ Read more
概述singleflight.Group 是 Go 語言擴展包的另一種同步原語,它能夠在一個服務中抑制對下游的多次重複請求。一個比較常見的使用場景是,我們使用 Redis 對數據庫中的數據進行緩存,發生緩存擊穿時,大量請求會打到數據庫上進而影響服務的尾延時。而 singleflight.Group 能夠有效地解決這個問題,它能夠限制對同一個鍵值對的多次重複請求,減少對下游的瞬時流量。在資源的獲取非 ⌘ Read more
一、前言平時遇到這樣的疑問,怎麼樣解決呢?教大家一個小技巧,windows 直接 ctrl + 單擊 fmt 包名查看註釋即可得到官方的解釋,如下二、案例說明package mainimport "fmt"type Person struct { Name string Age int}func main() { person := Person{ Name: "test", ⌘ Read more=
內存逃逸是什麼在程序中,每個函數塊都會有自己的內存區域用來存自己的局部變量(內存佔用少)、返回地址、返回值之類的數據,這一塊內存區域有特定的結構和尋址方式,尋址起來十分迅速,開銷很少。這一塊內存地址稱爲棧。 棧是線程級別的,大小在創建的時候已經確定,當變量太大的時候,會 "逃逸" 到堆上,這種現象稱爲內存逃逸。 簡單來說,局部變量通過堆分配和回收,就叫內存逃逸。 內存逃逸危害堆是 ⌘ Read more
在最新的一期 Go 開發團隊的每週會議中,他們討論了 Google3 再評估 SwissTable 的性能,或許值得跟進,替換標準庫的 map。 SwissTable [MichaelP]: Google3 may want to do some benchmarking on this. Maps are used heavily in google3. This may be of v ⌘ Read more
中文翻譯成 建造者模式、生成器模式。一個遵循《設計模式》一書臆造出來的例子如:Builder in Go / Design Patterns (refactoring.guru)[1],複雜又難以理解。實現strings.Builder的關鍵點是使用了可變長度的緩衝區來存儲字符串,並在構建過程中動態地增加其大小,以適應不斷增長的字符串。下面是一個簡單的示例:package mainimport ( ⌘ Read more
在項目中進行單元測試是一種重要的開發實踐。然而,當被測代碼依賴其他模塊或組件時,編寫單元測試變得複雜且不穩定。本文將介紹如何使用 mock 來編寫簡潔高效的單元測試。引言--首先我們先來看下項目中的依賴注入文件cmd/server/wire.go: tip: 該文件由google/wire工具自動編譯生成,禁止人爲編輯// Injectors from wire.go:func newApp(v ⌘ Read more
大家好,我是站長 polarisxu。Go 語言是一種廣受歡迎的編程語言,它以簡潔、高效、併發和跨平臺等特點而聞名。然而,任何一種編程語言都不可能完美無缺,Go 語言也不例外。在 Go 語言的開發過程中,可能會遇到一些安全漏洞,這些漏洞可能會影響到代碼的功能、性能或者安全性。爲了幫助開發者發現和修復這些漏洞,Go 團隊在 2021 年 11 月發佈了一個新的工具:Govulncheck,Go 語言 ⌘ Read more
今天給大家推薦一個 xxhash 庫,該庫是 go 語言實現的 xxHash 算法,比標準庫性能更高,最終生成一個 64 位的整型 hash 值。項目地址:https://github.com/cespare/xxhash Star:1.5k Used By:52.7k 根據使用量看起來是不是很流行。同時該包也是 xxHash 收錄的實現。 什麼是 xxHashxxHash 是一種速度極快的非 ⌘ Read more
作者:starrySky https://juejin.cn/post/7219249005904445477簡介本文將介紹 Go 語言中的 sync.Pool併發原語,包括sync.Pool的基本使用方法、使用注意事項等的內容。能夠更好得使用sync.Pool來減少對象的重複創建,最大限度實現對象的重複使用,減少程序 GC 的壓力,以及提升程序的性能。問題引入2.1 問題描述這裏我們實 ⌘ Read more
概述信號量是併發編程中常見的一種同步機制,在需要控制訪問資源的進程數量時就會用到信號量,它會保證持有的計數器在 0 到初始化的權重之間波動。每次獲取的資源都會將信號量中的計數器減去對應的數值,在釋放時重新加回來 當遇到計數器大於信號量大小時,會進入休眠等待其他線程釋放信號 Go 語言的擴展包中提供了帶權重的信號量 semaphore.Weighted,我們可以按照不同的權重管理資源的訪 ⌘ Read more
一、介紹當數組越界、訪問非法空間或者主動調用 panic 時,panic 會停掉當前正在執行的程序,包括所有協程,比起 exit 直接退出,panic 的退出更有秩序,它會先處理完當前 goroutine 已經 defer 掛上去的任務,執行完畢後再退出整個程序。二、執行 panic 底層到底發生什麼?接下來我們通過一個案例彙編執行得出 panic 底層執行哪些操作,如下:func main() ⌘ Read more
命令行工具大家都用過,如果你是運維人員,你可能會編寫命令行工具來完成各種任務。然而,命令行輸出的美觀和易讀性往往容易被忽視,很爛的輸出會讓人感覺你不專業。今天,我將向你介紹 Go 語言中一款牛逼的實戰工具——tablewriter 庫,它將幫助你在命令行輸出中展現出專業的一面。tablewriter:簡介與安裝Go 語言是一種簡潔、高效的編程語言,而 tablewriter 是一個流行的 Go ⌘ Read more
本文深入探討了 Go 語言中 “defer” 語句的一些鮮爲人知的複雜性,揭示了你可能還不知道的一些祕密。嘿,Go 開發者們!你認爲你對 defer 已經瞭然於胸了嗎?再想想吧!相信我,它遠不止於將函數執行推遲到當前函數的末尾。無論你是剛開始接觸 Go 還是經驗豐富的專業人士,你都肯定會從這篇指南中學到一些新的、超級有用的東西。讓我們開始吧。評估參數你知道在 Go 語言中,deferred 函 ⌘ Read more
在 Go 語言中,select 是一個關鍵字,用於監聽和 channel 有關的 IO 操作。通過 select 語句,我們可以同時監聽多個 channel,並在其中任意一個 channel 就緒時進行相應的處理。本文將總結一下 select 語句的常見用法,以及在使用過程中的注意事項。基本語法----select 語句的基本語法如下:select {case <-channel1: // ⌘ Read more
大家好,我是漁夫子。今天給大家推薦的是一個 google 開源的快速、無損的壓縮包:snappy。snappy 算法是 google 開源的。該包是 google 使用 go 語言來實現的。項目地址如下:項目地址:https://github.com/golang/snappy星標:1.4k使用者:97.7k簡介--該包的目標並不是最大化的壓縮比例,也不是和其他壓縮庫兼容;相反,snappy 算法 ⌘ Read more
Golang netpoller 的原理早在很久以前研究過一次,當時寫過一篇文章,最近部門正好有一次技術分享的名額,於是把這塊知識就重溫了一遍,做了一次關於 netpoll 的分享,也算是炒冷飯了,下面是分享的 ppt 內容。 Golang 網絡庫調用棧 思考問題:當沒有客戶端請求時候函數會阻塞在 Accept 上面,此時的阻塞是發生了進程切換,讓出 CPU 了嗎?當客戶端已經建立連接,但是沒 ⌘ Read more
概述除標準庫中提供的同步原語外,Go語言還在子倉庫sync中提供了 4 種擴展原語:golang/sync/errgroup.Group golang/sync/semaphore.Weighted golang/sync/singleflight.Group golang/sync/syncmap.Map 其中 golang/sync/syncmap.Map 在 Go1. ⌘ Read more
概述Go 語言標準庫中還包含條件變量 sync.Cond,它可以讓一組 Goroutine 都在滿足特定條件時被喚醒。每一個sync.Cond結構體在初始化時都需要傳入一個互斥鎖,我們可以通過下面的例子瞭解它的使用方法:var status int64func main(){ c := sync.NewCond(&sync.mutex{}) for i := 0; i < 10; i+ ⌘ Read more
大家好,我是漁夫子。今天有網友問通道和切片在賦值給另一個變量或作爲函數參數傳遞的時候是不是引用傳遞?因爲老師在講解的時候說是指針傳遞?先說結論:在 Go 語言中都是值傳遞,沒有引用傳遞。看看網友的提問:我們以 slice 爲例,來看一下:package mainimport ("fmt")func main() { a := make([]int, 10, 10) fmt.Println("a", ⌘ Read more=
概述\\-\\- jsonparser 是一個開源 JSON 包,號稱比標準庫 JSON 包性能高 10 倍 (具體情況取決於具體的負載大小和數據情況),內存分配優化到 0。 項目的目標是在不犧牲開發者用戶體驗和保持包 API 簡潔的前提下,儘可能地提升 JSON 操作的性能。基準測試----官方給出了 3 種類型 的基準測試結果,分別是 少量數據、中等數據 和 大量數據 情況下的 JSON 負載。js ⌘ Read more
sonic 是字節跳動開源的一款 Golang JSON 庫,基於即時編譯(Just-In-Time Compilation)與向量化編程(Single Instruction Multiple Data)技術,大幅提升了 Go 程序的 JSON 編解碼性能。同時結合 lazy-load 設計思想,它也爲不同業務場景打造了一套全面高效的 API。自研背景----Go 本身自帶標準 JSON 庫:e ⌘ Read more
引言就像物理世界的建築一樣,軟件架構也受到模式的約束。這些模式充當藍圖,塑造軟件系統的結構和行爲。其中一個至關重要的模式,常常默默無聞卻不可否認重要性的就是外觀模式。外觀模式源自於四人組(Gang of Four)在 1994 年出版的具有影響力的書籍《設計模式:可複用面向對象軟件的基礎》。它不僅僅是一個花哨的架構術語,它體現了一個簡單而強大的概念。外觀模式就像建築中的外觀一樣,爲複雜的子系統提供 ⌘ Read more
在網絡通信中,安全性至關重要。SSL/TLS 協議是一種廣泛使用的加密通信協議,用於保護敏感數據的傳輸。在本文中,我們將介紹如何使用 Golang 編程語言實現一個 SSL/TLS 協議的服務器,以確保我們的網絡通信是安全可靠的。1. SSL/TLS 簡介 SSL/TLS(Secure Sockets Layer/Transport Layer Security)是一組加密協議,用於在計算機網絡上 ⌘ Read more
大家好,我是藍胖子,做開發的同學應該經常聽到過負載均衡的概念,今天我們就來實現一個乞丐版的四層負載均衡,並用它對 mysql 進行負載均衡測試,通過本篇你可以瞭解到零拷貝的應用,四層負載均衡的本質以及實踐。本文代碼已經上傳到 githubhttps://github.com/HobbyBear/codelearning/tree/master/layer4balance爲了知識的完整性,我們也 ⌘ Read more
大家好,我是漁夫子。今天給大家推薦一個將系統的環境變量獲取並解析到結構體的包:env。 項目地址:https://github.com/caarlos0/envstar:3.7k 貢獻者:54 使用者:1.8k該包的實現是基於標準庫 os/env 包中的相關函數(比如 Getenv�)來獲取系統的環境變量的。獲取到環境變量值後,再通過結構體中的 tag,將值映射到對應的結構體字段上。使 ⌘ Read more
01 介紹Go 語言是強類型編程語言,一些使用弱類型編程語言的讀者朋友們在初學 Go 語言時,多多少少都會不太適應 Go 語言的類型。Go 語言變量類型包含基礎類型和複合類型,類型轉換和類型斷言一般是對基礎類型的處理,基礎類型包含整數、浮點數、布爾和字符串。其中整數類型又稱爲整型,分爲有符合和無符號,各自又包含不同大小,8 位、16 位、32 位和 64 位,其中 int32 和 uint8 的類 ⌘ Read more
WaitGroup 概述WaitGroup在 go 語言中,用於線程同步,單從字面意思理解,wait等待的意思,group組、團隊的意思,WaitGroup就是指等待一組,等待一個系列執行完成後纔會繼續向下執行。WatiGroup是sync包中的一個struct類型,用來收集需要等待執行完成的goroutine。下面是它的定義:// WaitGroup用於等待一組線程的結束。 父線程調用Add方法 ⌘ Read more
作者:starrySky https://juejin.cn/post/7212270321621483578簡介本文將介紹 Go 語言中的 sync.Cond 併發原語,包括 sync.Cond的基本使用方法、實現原理、使用注意事項以及常見的使用使用場景。能夠更好地理解和應用 Cond 來實現 goroutine 之間的阻塞等待。基本使用2.1 定義sync.Cond是 Go 語言標準 ⌘ Read more
概述--本文從開發中常見的應用場景 “路由管理” 爲例,介紹三種常用的實現方案背後的數據結構和算法 (代碼實現爲 Go 語言)。應用示例----下面是一個典型的 REST 風格的 API 列表:\\| Method \\| URL \\|\\| --- \\| --- \\|\\| GET \\| /users/list \\|\\| GET \\| /users/dbwu \\|\\| POST \\| /users \\|\\| PUT \\| /users/ ⌘ Read more
大家好,我是漁夫子。今天給大家介紹一下如何利用 go 中的緩衝 channel 來控制協程的數量。如下示例:package mainimport ( "fmt" "sync/atomic")func main() { sem := make(chan struct{}, 10) var count int32 for { //time.Sleep(5\\*ti ⌘ Read more=*
研發效率和系統穩定性是研發團隊永遠無法繞開的話題,前者決定業務迭代效率,而後者決定交付質量。多年來,滴滴在保障穩定性的前提下不斷探索更高效的技術手段,積累了大量實踐經驗。近期由網約車研發效率與穩定性負責人魏靜武在 Gopher China 上分享了滴滴在相關領域的實踐。 以下爲演講實錄。很多技術同學或許都有過類似經歷:處理故障的過程中除了要承受巨大壓力之外,還會承受來自業務方新需求上線的壓力。似 ⌘ Read more
引言大家好,開發者們!今天我們要深入探討設計模式的有趣世界,重點是工廠方法模式。如果你是 GoLang 的愛好者或者是一個好奇的技術迷,本文將爲你提供寶貴的見解和實際示例。所以請拿杯咖啡,坐下來,開始探索吧!什麼是工廠方法設計模式?在軟件開發中,設計模式是解決常見問題的解決方案。其中之一就是工廠方法模式,它是一種創建型設計模式,提供了一個在超類中創建對象的接口,但是讓子類來決定創建哪種類型的對象。 ⌘ Read more
01 前言這一篇,我們來講講 go-zero 框架與 asynq 實現的分佈式任務隊列。在此之前,已經寫過了一篇:Go 簡單可靠高效的分佈式任務隊列 asynq。有小夥伴問能不能通過 go-zero 實現一遍,現在它來了。這篇文章,用的是之前的例子,不瞭解 asynq 的小夥伴,可以通過上邊的鏈接跳轉過去。02 go-zero 框架go-zero 是一個集成了各種工程實踐的 web 和 rpc 框 ⌘ Read more
作者:songcser https://juejin.cn/post/7221691217968332858GingoIntroduce---------Gingo 是基於 gin 框架爲核心的腳手架,能夠快速創建 Restful 風格的 API 接口,並且能提供簡單的後臺管理功能,使用本項目可以快速完成業務邏輯開發。Feature-------gin 框架,簡單,高效,輕量 go ⌘ Read more
編寫 Golang 文檔最近我專注於 eBPF,需要寫比以前更多的東西。這也意味着要爲各種生態系統撰寫文檔。雖然某些工具在作者完成工作時產生阻力,但本文介紹我目前爲編寫 Golang 文檔而設置的工作流程。 godoc 已被棄用與我的 Rust 設置類似,我想在發佈之前本地查看我的模塊文檔在 pkg.go.dev 上的呈現方式。這是可能的,但自那時起 godoc 就已被棄用,沒有官方解決方案。現 ⌘ Read more
1 原理介紹本期基於 go 語言和大家探討設計模式中的觀察者模式. 觀察者模式適用於多對一的訂閱 / 發佈場景.• ” 多 “:指的是有多名觀察者 • ” 一 “:指的是有一個被觀察事物 • ” 訂閱 “:指的是觀察者時刻關注着事物的動態 • ” 發佈 “:指的是事物狀態發生變化時是透明公開的,能夠正常進入到觀察者的視線 在上述場景中,我們瞭解到核心對象有兩類,一類是 “觀 ⌘ Read more
一、打樁介紹 樁或稱樁代碼,是指用來代替關聯代碼或者未實現代碼的代碼。如果函數 B 用 B1 來代替,那麼,B 稱爲原函數,B1 稱爲樁函數。打樁就是編寫或生成樁代碼。1.1 目的函數打樁的目的一般是隔離、佔位和控制。 隔離是指將測試任務從產品項目中分離出來,使之能夠獨立編譯、鏈接,並獨立運行。隔離的基本方法就是打樁,將測試任務之外的,並且與測試任務相關的代碼,用樁來代替,從而實現分離測試任務。例 ⌘ Read more
大家好,我是漁夫子。今天給大家推薦一個高性能的網絡爬蟲框架:Geziyor。該框架可以用來抓取網站內容並從中提取出結構化的數據。其用途極爲廣泛,可以用於數據挖掘、監控以及自動化測試。項目地址:https://github.com/geziyor/geziyor接下來我們來看 Geziyor 框架的使用和特點。基本使用----該框架使用很簡單,就是配置對應的選項啓動即可。以抓取網址 http://q ⌘ Read more
大家好,我是藍胖子,零拷貝技術相信大家都有所耳聞,但是今天呢,我不僅會講述零拷貝技術的原理,並將從實際代碼出發,看看零拷貝技術在 golang 中的應用。現在讓我們開始吧。零拷貝原理-----零拷貝技術的原理本質上就是減少數據的拷貝次數,因爲當調用傳統 read write 方法讀取文件內容並返回給客戶端的時候,會經過四次拷貝。我用 golang 代碼舉例如下func main() { ⌘ Read more
01前情回顧在基礎篇中,我們給出了模板方法設計模式的定義,並舉證了該模式有哪些優點。隨後,我們給出了這次重構房間服務的背景,以及 C++ 版本和 Go 版本存在的一些差異。在上一篇文章的最後,我們給出了一個粗略,甚至有一些簡陋的 Room 接口定義的示例代碼。今天,我們將重點講解一下 Room 接口的設計思路,以及一份相對完整的 Room 接口的實現代碼。 02Room 接口設計思路首先,我們以 ⌘ Read more
01模板方法設計模式介紹模板方法模式(Template Method Pattern)是一種行爲型設計模式,它定義了一個操作的算法骨架,並允許子類在不改變算法結構的情況下重寫算法的特定步驟。該模式基於一種稱爲 “模版方法 “的核心概念,通過將通用算法步驟放在一個抽象的基類中,然後允許具體子類實現特定步驟的定製化行爲。 以下是模版方法設計模式的幾個關鍵要素: 抽象類(Abstract Class ⌘ Read more
ringbuffer 因爲它能複用緩衝空間,通常用於網絡通信連接的讀寫,雖然市面上已經有了 go 寫的諸多版本的 ringbuffer 組件,雖然諸多版本,實現 ringbuffer 的核心邏輯卻是不變的。但發現其內部提供的方法並不能滿足我當下的需求,所以還是自己造一個吧。源碼已經上傳到 githubhttps://github.com/HobbyBear/ringbuffer需求分析---- ⌘ Read more
大家好,我是 陳明勇,一個熱愛技術,喜歡專研技術的程序員。歡迎關注公衆號:Go 技術乾貨,進羣與衆多 Gopher 交流學習,或訂閱網站 https://chenmingyong.cn 一起學習,一起進步!前言當你深入研究官網庫、開源庫或者任何一個 Go 項目時,你都會發現 iota 這個神奇的標識符無處不在。它扮演着一種重要的角色,讓代碼變得更加簡潔、清晰,並提高了可讀性和可維護性。它的應用範圍 ⌘ Read more
一、爲什麼需要連接池 如果不用連接池,而是每次請求都創建一個連接是比較昂貴的,因此需要完成 3 次 tcp 握手。同時在高併發場景下,由於沒有連接池的最大連接數限制,可以創建無數個連接,耗盡文件描述符。連接池就是爲了複用些創建好的連接。二、連接池設計\\*基本上連接池都會設計以下幾個參數:初始連接數:在初始化連接池時就會預先創建好的連接數量,如果設置得:過大:可能造成浪費 過小:請求到來時需要 ⌘ Read more
File: mgc.gomgc.go 是 Go 語言 runtime 包中的一部分,主要負責 Go 語言的垃圾回收機制 (Garbage Collector) 的實現。Go 的垃圾回收機制採用了標記 - 清除 (mark and sweep) 算法,其過程主要包括以下幾個步驟:標記階段(Marking Phase):從根對象開始,遍歷所有對象標記活動對象,即那些在程序中仍然可達的對象。這個過程使用 ⌘ Read more
1cgoCheckPointer----------------得先從 cgo 的一個限制說起:如果將一個 Go 對象的指針傳給 C,那麼這個 Go 對象裏,是不能再有指針指向 Go 對象的(空指針可以)。這個檢查是在運行時進行的,cgoCheckPointer,如果檢查到了,就拋 panic: cgo argument has Go pointer to Go pointer舉個簡單的例子,如果 ⌘ Read more
netdevsim,Netwoking Device Simulator,網絡設備模擬器。netdevsim 就是用來模擬網絡設備的,其實它是 Linux 裏的一種網絡設備驅動;可以用來測試一些網絡功能,比如 tc、tc-bpf、XDP。netdevsim ID--------------創建 netdevsim 設備:echo "[ID] [PORTCOUNT] [NUMQUEUES]" / ⌘ Read more
對於一個客戶端創建請求的過程conn, err := grpc.Dial("example:8009", grpc.WithInsecure())if err != nil { panic(err)}gRPC 客戶端通過服務發現解析請求,將名稱解析爲一個或多個 IP 地址,以及服務配置 客戶端使用上一步的服務配置、ip 列表、實例化負載均衡策略 負載均衡策略爲每個服務器地址創建一個 ⌘ Read more
什麼是調用約定? 在計算機科學中,調用約定是一種定義子過程從調用處接受參數以及返回結果的方法的約定彙編調用約定------如下彙編代碼中,通過中斷 0x10 將 BP 指向的字符串輸出到顯示設備中,字符串長度儲存在 CX 中, CPU 處理中斷時會通過 CX、BP 等寄存器獲得調用參數,將字符串 Hello World 寫入顯存中,進而展示在屏幕上。hello: DB "Hello World" ⌘ Read more
1 適配器模式本期繼續和大家探討 Golang 設計模式這一主題. 今天,我們來聊一聊設計模式中的 "適配器模式".適配器模式的作用是能夠實現兩個不兼容或弱兼容接口之間的適配橋接作用,該設計模式中會涉及到如下幾個核心角色:• 目標 target:是一類含有指定功能的接口 • 使用方 client:需要使用 target 的用戶 • 被適配的類 adaptee:和目標類 target 功 ⌘ Read more
chromedp 是 go 寫的,支持 Chrome DevTools Protocol 的一個驅動瀏覽器的庫。https://github.com/chromedp/chromedp。隨着前端 spa 應用的普及,傳統的爬蟲很難抓取到我們想要的內容,Chrome DevTools Protocol (CDP) 提供了一個完整的瀏覽器接口,使得我們可以用瀏覽器一樣的環境來模擬請求來 ⌘ Read more
爲什麼需要協程池 協程池在併發編程中扮演着重要的角色,它的存在有以下幾個主要原因:降低併發任務的開銷:在併發編程中,創建和銷燬 goroutine 的開銷是比較大的。使用協程池可以避免頻繁地創建和銷燬 goroutine,而是重複利用已經創建好的 goroutine,從而降低了開銷。 控制併發的數量:協程池可以限制併發任務的數量,防止系統資源被過度佔用。通過控制協程池中工作協程的數量,可以 ⌘ Read more
在 golang 中,經常會出現需要發送短信、通知或其它內容的需求,而這些事情不需要即時性且有點耗時。我們最常用的方法是使用一個 goroutine 來做這個事情。 例如:在訂單發貨後,我們需要給用戶發送一個短信通知。func SendSms(tmpl string,msg string){ // 發送短信代碼}func OrderShipment(){ // 訂單發貨邏輯 / ⌘ Read more
這一篇,我們來學習一下如何使用 httpmock 庫,當使用 Go 語言編寫 HTTP 服務時,可以使用第三方庫來模擬 HTTP 請求和響應,例如:httpmock 庫。這個庫提供了一些方便的函數和結構體,用於在測試中模擬 HTTP 請求和驗證期望的 HTTP 調用。 輕鬆模擬來自外部資源的 http 響應。 https://github.com/jarcoal/httpmock01 服務 ⌘ Read more
File: types.gotypes.go 文件是 Golang 運行時包(runtime)中的一個文件,它定義了運行時所需的各種類型。該文件中定義了一些重要的類型,比如:String、Bool、Int、Float、Map、Slice、Chan 等類型。這些類型是 Golang 程序運行時所需的基本類型,它們是由運行時系統處理和管理的。types.go 文件中還定義了一些數據結構,如:Array ⌘ Read more
很多 Go 項目的源碼,在讀的過程中會發現一個很常見的參數 ctx,而且基本都是作爲函數的第一個參數。爲什麼要這麼寫呢?這個參數到底有什麼用呢?帶着這樣的疑問,我研究了這個參數背後的故事。開局一張圖:核心是 Context 接口:// A Context carries a deadline, cancelation signal, and request-scoped values// acro ⌘ Read more
01 前言這一篇,我們一起來了解一下 ECDH 算法。ECDH 算法是一種基於橢圓曲線加密的密鑰協商算法,被廣泛應用於網絡通信、數字簽名等領域。隨着互聯網的發展,數據安全問題越來越受到人們的關注,國內也頒佈了《中華人民共和國個人信息保護法》以及對外出口有歐盟的 GDPR 等。而 ECDH 算法作爲一種安全性高、計算效率高的加密算法,受到了越來越多的關注和應用。這篇文章一起來了解一下 ECDH 算法 ⌘ Read more
圖片拍攝於 2023 年 04 月 28 日 日本奈良SOCKS5(Socket Secure 5)是一種網絡協議,用於在客戶端和代理服務器之間進行通信。它是 SOCKS 協議的第五個版本,SOCKS5 協議支持 TCP 和 UDP 協議,並提供了認證和加密的功能。 SOCKS5 協議廣泛用於代理服務器、xx 上網、匿名訪問、負載均衡等場景。它提供了一種通用的、靈活的代理解決方案,可以在各種網絡 ⌘ Read more
什麼是虛擬內存虛擬內存(Virtual Memory)是計算機系統中的一種技術,它允許程序使用比實際物理內存更大的內存空間。虛擬內存的概念和實現是爲了解決以下問題:內存限制:計算機系統的物理內存是有限的,而運行的程序可能需要比物理內存更多的內存空間。虛擬內存提供了一個抽象的、更大的內存空間供程序使用。內存隔離:虛擬內存可以將不同的程序或進程隔離開,使它們擁有各自獨立的內存空間,互不干擾。這樣可以提 ⌘ Read more
01 前言這篇文章,讓我們來學習如何創建自己的授權認證系統吧!在使用 Go 語言時,我們可以藉助一個叫做 go-oauth2 的開源框架來快速實現這個目標。 一種開放協議,允許以簡單和標準的方法從 Web、移動和桌面應用程序進行安全授權。 https://github.com/go-oauth2/oauth202 什麼是 OAuth 2.0 呢?OAuth2.0 (Open Authori ⌘ Read more
\\*一、前言core dump 是一個包含着意外終止的程序其內存快照的文件。這個文件可以被用來事後調試(debugging)以瞭解爲什麼會發生崩潰,同時瞭解其中涉及到的變量。通過 GOTRACEBACK,Go 提供了一個環境變量用於控制程序崩潰時生成的輸出信息。這個變量同樣可以強制生成 core dump,從而使調試成爲可能。1.1 GOTRACEBACKGOTRACEBACK 控制程序崩潰時輸出的 ⌘ Read more*
01 介紹Go 語言作爲強類型語言,在使用 Golang 開發項目時,經常會遇到類型轉換的場景,整型之間可以直接轉換,字節切片和字符串之間也可以直接轉換。但是,如果整型和字符串之間做類型轉換,則需要使用 strconv 標準庫提供的函數。02 標準庫 strconv 類型轉換Go 語言標準庫 strconv[1] 提供了一些類型轉換的函數,比如在項目開發中使用比較多的整型和字符串之間的類型轉換。f ⌘ Read more
請求處理異常處理對於調用方對於大多數 RPC 或 CS 調用來說, 爲了保護敏感信息安全:只應向調用者反饋錯誤碼和簡明的錯誤信息 不應暴露敏感或內部實現細節 (包含堆棧跟蹤、變量值等信息) 原因是:錯誤碼和簡明錯誤信息足以讓調用者理解調用失敗及大致原因 完整異常詳情可能包含服務器內部實現細節或用戶隱私信息 如果此信息暴露給未經授權的調用者, 會存在安全隱患 舉個例子: ⌘ Read more
死鎖\\-\\- 指兩個或多個進程因互相持有對方所需的資源而處於等待狀態,從而導致程序停止運行的現象。簡單來說,在一個系統中,如果進程之間形成了一個循環依賴關係,那麼就會發生死鎖。 💡 本文所有代碼實現語言爲 Go, 其他語言的讀者可以使用讀僞代碼的思路來閱讀代碼,主要目的在於理清邏輯主幹,不必過度陷入細節。四個必要條件互斥: 同一時刻只能有一個進程佔用資源,如果其他進程想要訪問該資源必須等待 ⌘ Read more
\\*一、前言Fyne 是 fyne-io 組織在 Github 上開源的 Go 語言 UI 工具包 ,目前版本爲 v2.3.5,2.3 版是 Fyne API 的最新版本,它添加了一個精緻的主題設計以及雲存儲,同時改進了國際語言和許多語言的文本處理較小的功能添加。我們現在正致力於下一個代號爲 Dalwhinnie。Fyne 是由 Golang 開發的跨平臺應用,除了對 Windows、Mac、Lin ⌘ Read more*
\\*一、前言 Devle 是一個非常棒的 golang 調試工具,支持多種調試方式,直接運行調試,或者 attach 到一個正在運行中的 golang 程序,進行調試。實現類似 Visual Studio 的斷點調試功能 實現在程序 Crash 的時候生成 Coredump 文件 實現 Web Server 調試。 1.1 Delve 常用命令二、安裝go get -u ⌘ Read more*
概述--Go 語言標準庫中的 map 數據類型並不是線程安全的,多個 goroutine 可以併發讀取同一個 map, 但是不能併發寫入同一個 map, 否則會引發 panic。爲了解決這個問題,實際開發中通常會使用下面的三種方案中的一個或多個:通過 map 數據類型 + 鎖 (互斥鎖, 讀寫鎖) 標準庫內置的 sync.Map 對象 (支持併發讀寫) 分段鎖 作爲補充,本文會順 ⌘ Read more
Sonic 是字節跳動開源的一款 Go 語言 JSON 解析庫,按照官方的說法:Sonic 是一個速度奇快的 JSON 序列化 / 反序列化庫,由 JIT (即時編譯)和 SIMD (單指令流多數據流)加速。 對於所有大小的 json 和所有使用場景, Sonic 表現均爲最佳。 自 2021 年 7 月份發佈以來,Sonic 已被抖音、今日頭條等業務採用,累計爲字節跳動節省了數十萬 ⌘ Read more
在使用 Golang 創建複雜對象時,常用的兩種模式是選項模式(Options pattern)和構建器模式(Builder pattern)。這兩種模式各有優缺點,選擇適合項目需求的模式取決於具體情況。問題假設我們想創建一個具有許多可選參數的複雜對象。一種方法是創建一個構造函數,該構造函數接受所有參數,併爲可選參數提供默認值。然而,這種方法有一些缺點:1. 很難記住參數的順序。 2. 很難 ⌘ Read more
你是否是那些在 Go 中缺少默認參數值而感到沮喪的衆多程序員之一?如果是的話,你絕對不是一個人! 如何爲函數參數添加默認值。你是否曾因爲 Go 語言沒有默認參數值而感到沮喪?好消息是,你並不孤單!這個令人討厭的限制會讓你的代碼更加繁瑣,難以閱讀。每次都需要寫額外的代碼來檢查參數是否提供,並在沒有提供時使用默認值。別擔心!有辦法繞過這個限制,在你的 Go 函數中添加默認值。當然,這可能沒有內置的方 ⌘ Read more
File: malloc.gomalloc.go 文件是 Go 語言中管理內存分配和釋放的核心文件之一。它包含了 Go 語言的內存管理器(Memory Allocator)實現。Go 語言使用了一種名爲 mcache 的內存管理技術,它是一種基於線程本地(Thread-Local)緩存的內存分配器,它將一些特定大小的內存分配請求分配到緩存線程中來處理,以減少對全局內存池的訪問。malloc.go ⌘ Read more
在 Golang 中,如果 goroutine 持有某些資源(如內存、文件描述符等)但在其生命週期結束時未正確釋放這些資源,則可能會發生內存泄漏。這通常是由於 goroutine 在退出時未能正確關閉通道或釋放鎖而引起的。爲了避免內存泄漏,我們應該遵循以下幾個最佳實踐:使用 defer 語句來確保在函數返回之前釋放資源避免在 goroutine 中使用全局變量,因爲它們可能會在 goroutine ⌘ Read more
大家好,我是漁夫子。代碼重構是在不改變外部功能的情況下對現有代碼進行改進。它是編程的核心部分之一,不容忽視。否則,您就無法獲得更好的代碼版本。代碼重構可以增強代碼的可讀性、可維護性和可擴展性。它還旨在提高性能和開發人員的工作效率。今天,我們將探討一些可以幫助您更好地重構代碼的技巧。如何重構----在尋找重構的技術之前,讓我們看看如何將代碼重構集成到編碼過程中。以下建議可用於此目的:現在,讓我們從用 ⌘ Read more