# I am the Watcher. I am your guide through this vast new twtiverse.
# 
# Usage:
#     https://watcher.sour.is/api/plain/users              View list of users and latest twt date.
#     https://watcher.sour.is/api/plain/twt                View all twts.
#     https://watcher.sour.is/api/plain/mentions?uri=:uri  View all mentions for uri.
#     https://watcher.sour.is/api/plain/conv/:hash         View all twts for a conversation subject.
# 
# Options:
#     uri     Filter to show a specific users twts.
#     offset  Start index for quey.
#     limit   Count of items to return (going back in time).
# 
# twt range = 1 2879
# self = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=1779
# next = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=1879
# prev = https://watcher.sour.is?uri=https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt&offset=1679
Go1-21 速覽:過了一年半,slices、maps 泛型庫終於要加入標準庫**
大家好,我是煎魚。在 2022 年 3 月,Go1.18 終於發佈。在該版本中,包含了 Go1.17 起就已存在的泛型,並於此版本正式發佈泛型特性。這是一個備受關注和爭議的新特性。在 reddit 甚至有網友放出了這張圖:泛型庫終於合進 master--------------曾經在 Go1.18 時,Go 語言之父 @Rob Pike 冒了個泡,掌了舵,讓不要這麼急把泛型重寫進標準庫。怕太着急, ⌘ Read more
批量讀寫網絡包- 只爲更高性能**
雖然網絡協議棧提供了豐富的功能,讓我們可以方便的實現網絡的數據交流,但是有時候我們對協議棧的性能還是不是那麼滿意的,前幾篇文章我也介紹了通過 XDP 等技術高效處理網絡數據的方式,但是畢竟 XDP 還沒有那麼廣泛的應用,使用起來也還不是那麼簡單,如果我們通過編程語言提供的標準庫來實現數據的讀寫,還怎麼能提高性能呢?今天就介紹一種方式,批量的讀寫數據包。直觀上看,我們也能理解批收發網絡包比單個的收發 ⌘ Read more
解析 Gin 框架底層原理**
0 前言上一週和大家聊了 Golang HTTP 標準庫的實現原理. 本週在此基礎上做個延伸,聊聊 web 框架 Gin 的底層實現原理.1 Gin 與 HTTP1.1 Gin 的背景-----------Gin 是 Golang 世界裏最流行的 web 框架,於 github 開源:https://github.com/gin-gonic/gin其中本文涉及到的源碼走讀部分,代碼均取自 gin ⌘ Read more
Go 設計模式 -- 命令模式**
大家好,這裏是每週都陪你進步的網管,假期歸來咱們繼續更新設計模式系列,這次要和大家一起學習的是命令模式,如果你對領域驅動設計感興趣,這個模式一定要好好學,命令模式是 DDD 風格的框架中高頻使用的一個模式。命令模式是一種行爲型模式。它通過將請求封裝爲一個獨立的對象即命令對象,來解耦命令的調用者和接收者,使得調用者和接收者不直接交互。在命令對象裏會包含請求相關的全部信息,每一個命令都是一個操作的請求 ⌘ Read more
寫給 go 開發者的 gRPC 教程 - 用戶認證**
gRPC 的用戶認證----------用戶認證,簡單來說就是驗證請求的用戶身份,避免破壞者僞造身份獲取他人數據隱私。比如當訪問微博網站時,微博服務端通過用戶認證來識別你的身份,並返回正確的主頁數據用戶認證有很多方式。例如 HTTP 中使用的 cookie、session、oauth、jwt 等等。gRPC 框架並不限制用戶認證的方式,而是提供了開放的能力來支持各種各樣的用戶認證gRPC 的用戶 ⌘ Read more
使用 Go 實現 traceroute 工具**
traceroute 是一種用於診斷網絡連接問題的實用程序,它可以確定兩臺計算機之間的網絡路徑和網絡時延。traceroute 工具在網絡工程、系統管理和網絡安全中都有廣泛的應用。traceroute 工具也是使用了 ICMP 這種 Internet 控制消息協議,它可以讓用戶探測到目標主機與本地主機之間的網絡路徑和路由器(或網關)的數量。traceroute 工具會向目標主機發送一系列 UDP ⌘ Read more
GO千練 — 方法和接口**
方法--方法概念Go 沒有類,但是 GO 可以爲結構體類型定義方法,請記住:方法只是一個帶接收者參數的函數。 方法就是一類帶特殊的 接收者 參數的函數。方法接收者在它自己的參數列表內,位於 func 關鍵字和方法名之間。請參考如下 nextTenYears() 方法的定義:package mainimport "fmt"type Person struct {    Name string ⌘ Read more
這些最常用的 Go 工具集命令,新手 Gopher 一定要掌握**
本文將介紹一些最基本的 Go 命令行命令。如果你剛接觸 Go 語言,那你有必要記住它們,因爲這些命令是 Go 開發者日常工作中所必備的。Go version開始 Go 項目前,我們應該確保開發機上已經安裝好了 Go 編譯器。這可以通過 https://go.dev/doc/install 進行下載安裝,如果有多版本安裝需求可以參考文章簡潔的 Go 多版本管理機制。通過執行以下命令可以查看安裝的 G ⌘ Read more
Go 學習筆記 - String 底層實現原理**
1、字符集計算機裏 1bit 可以是 0 也可以是 1 8bit 組成 1byte, 全爲 0 時表示數字 0, 全爲 1 時表示數字 255 2byte 可以表示 65536 個數字, 更多字節數可以表示更大的數字範圍 字符如何表示呢? ASCII 字符集: 一共收錄了 128 個字符, 其擴展字符集也只有 256 個 (包括英文字母、阿拉伯數字、西文字、控制字符) ⌘ Read more
「Go 工具箱」go-mask:一個對數據脫敏處理的包**
大家好,我是漁夫子。今天給大家推薦一款在輸出中對敏感數據進行脫敏的工作包:go-mask。那麼,什麼是對敏感數據脫敏呢?就是將敏感信息輸出的時候替換成星號或其他字符。比如手機號碼,身份證信息,姓名等。go-mask 包還是比較新的,是在兩週前提交的。所以星標只有 71 個。星標雖少,但功能還是很強大的。我們看看 go-mask 都有哪些功能。特徵通過結構體的 tag 功能可以脫敏結構體中的任何字段 ⌘ Read more
使用 Go 語言實現 ping 工具**
ping 是一個網絡工具,它被廣泛地用於測試網絡連接的質量和穩定性。當我們想知道我們的電腦是否能夠與其他設備或服務器進行通信時,ping 就是我們最好的朋友。當我們想偵測網絡之間的連通性和網絡質量的時候,也常常使用 ping 工具測量,因爲它是操作系統常帶的一個網絡診斷工具,小而強大。ping 最初是由 Mike Muuss 在 1983 年爲 Unix 系統開發的。它的名字是來自於海軍潛艇的聲納 ⌘ Read more
Go 之 Unsafe 包**
概述--在 Go 中,我們常見的指針是類型安全的,但是存在很多的限制。比如:Go 的指針不能進行數學運算 不同類型的指針不能進行相互轉換 不同類型的指針不能用 或者!=比較 不同類型的指針不能相互賦值 但是在 Go 中也存在非類型安全的指針,比如說 unsafe.Pointer。unsafe 包中包含繞過 Go 程序的類型安全的操作。導入不安全的包可能是不可移植的, ⌘ Read more
=
GMP 調度器(上篇)- 數據結構**
概述\\-\\- G:  表示 goroutine M: 表示 操作系統的 線程 P:  表示 處理器,運行在線程上的 本地調度器內部實現----本文主要研究一下 GMP 的內部實現,相關文件目錄爲 $GOROOT/src/runtime,筆者的 Go 版本爲 go1.19 linux/amd64。GMP 數據結構--------G M P 相關的數據結構定義,全部定義在 $GOROOT/s ⌘ Read more
Golang Slice 詳解**
什麼是切片Go 語言中的切片 (slice) 的本質是對數組的封裝, 其描述了一個數組的片段。切片實際上是一個結構體,其包含了三個字段,如下圖所示type slice struct {   array unsafe.Pointer   len   int   cap   int}1.array: 是一個非安全類型的指針,指向底層數組,是一個連續的內存塊。 2.len: 指 slice 的實際長度 ⌘ Read more
Go 學習筆記 - 協程和 IO 多路複用**
1、什麼是協程?進程的虛擬地址空間劃分爲用戶空間和內核空間 線程是進程中的執行體, 擁有一個執行入口, 以及從虛擬地址空間中分配的棧 (包括用戶棧和內核棧) 操作系統會記錄線程控制信息, 線程在獲得時間片就可以被執行, CPU 的指令指針和棧指針就會記錄和執行線程相關的信息 當線程創建了很多個執行體, 並且也給這些執行體指定入口和分配棧內存, 就可以按需調度這些執行體 線程 ⌘ Read more
protoc 插件 - protoc-gen-grpc-gateway-gosdk
基本介紹--------protoc-gen-grpc-gateway-gosdk 是一個 protoc 插件, 能根據 proto 文件一鍵生成 go http sdk 客戶端代碼,通過藉助 grpc-gateway 插件將 grpc 接口轉化爲 http 的方式, 進而可以通過本插件生成 http sdk 代碼。特性------一鍵自動生成 go 客戶端代碼, 無需人工維護通過設置統一網關, ⌘ Read more
爲什麼 defer 的執行順序和註冊順序不同?**
概述--defer 語句的執行順序是 後進先出,和數據結構中的 Stack (棧) 一樣。package mainfunc main() {    defer func () {        println(1)    }()    defer func () {        println(2)    }()    defer func () {        println(3)    } ⌘ Read more
「Go 框架」深入理解 gin 框中 Context 的 Request 和 Writer 對象**
大家好,我是漁夫子。今天跟大家聊一聊 gin 中 Context 對象中的 Request 和 Writer 對象。背景--在使用 gin 框架時,我們定義的請求處理器,輸入參數總是一個 gin.Context 的指針類型,代表請求的上下文。在處理器的業務邏輯中,通過 Context.Request 可以獲取本次請求的參數值;通過 Context.Writer 就能將響應結果輸出給客戶端了。如下代 ⌘ Read more
Golang 垃圾回收源碼走讀**
0 前言近期在和大家一起探討 Golang 內存管理機制相關的內容.此前分別介紹了 Golang 內存模型及分配機制和 Golang 的垃圾回收原理有關的內容. 本篇會基於源碼走讀的方式,對 Golang 垃圾回收的理論進行論證和補充. 本文走讀的源碼版本爲 Golang 1.19.由於內容之間具有強關聯性,建議大家先完成前兩篇內容的閱讀,再開啓本篇的學習.1 源碼導讀1.1 源碼框架------ ⌘ Read more
Golang 垃圾回收原理分析**
0 前言近期在和大家一起探討 Golang 內存管理機制.本系列內容分爲兩部分,第一部分談及 Golang 內存模型以及內存分配機制,第二部分和大家討論 Golang 的垃圾回收機制.本文是其中第二部分. 由於 GC 模塊內容篇幅不小,且筆者近期工作繁忙,因此這部分不得不拆爲上下兩篇.本文是上篇,在理論層面對 Golang GC 展開介紹,下篇將於下週發出,屆時會基於源碼走讀的方式對理論進行補充論 ⌘ Read more
用 Golang 實現 BFS 遍歷二叉樹**
二叉樹是一種常用的數據結構,它在計算機科學中有着廣泛的應用。BFS(Breadth First Search)算法是一種用於遍歷樹或圖的算法,它從根節點開始,逐層遍歷每個節點,直到找到目標節點或遍歷完整個樹。下面是用 Golang 實現 BFS 遍歷二叉樹算法的示例代碼:type TreeNode struct {    Val int    Left TreeNode    Right Tree ⌘ Read more
一文讓你喫透 golang 原子操作**
在我們前面的一些介紹 sync 包相關的文章中,我們應該也發現了,其中有不少地方使用了原子操作。比如 sync.WaitGroup、sync.Map 再到 sync.Pool,這些結構體的實現中都有原子操作的身影。原子操作在併發編程中是一種非常重要的操作,它可以保證併發安全,而且效率也很高。本文將會深入探討一下 go 中原子操作的原理、使用場景、用法等內容。\\| 一、原子操作含義:原子操作是變量級別 ⌘ Read more
基於 etcd 實現 grpc 服務註冊與發現**
0 前言幾周前和大家一起走讀了 grpc-go 客戶端的源碼鏈路,本篇則是想着重探討一下其中涉及到的 “服務發現” 以及 “負載均衡” 的相關內容. 本文會貼近於生產環境,使用到分佈式存儲組件 etcd 作爲 grpc 服務的註冊與發現模塊,並引用 roundRobin 輪詢算法作爲負載均衡策略.1 背景1.1 grpc 源碼-----------本系列探討的主題是由 google 研發的開源 r ⌘ Read more
如何使用 Grafana Pyroscope 解決 Go 中的內存泄漏問題**
內存泄漏在任何編程語言中都可能是一個重大問題,Go 也不例外。儘管是一種垃圾收集語言,Go 仍然容易受到內存泄漏的影響,這可能導致性能下降並導致操作系統內存不足。爲了保護自己,Linux 操作系統實施了一個內存不足 (OOM) killer,它可以識別並終止消耗過多內存並導致系統變得無響應的進程。在這篇博文中,我們將探討 Go 中內存泄漏的最常見原因,並演示如何使用 Grafana Pyrosco ⌘ Read more
單測時儘量用 fake object
單元測試的難點:外部協作者 (external collaborators) 的存在---------------------------------------------單元測試是軟件開發的一個重要部分,它有助於在開發週期的早期發現錯誤,幫助開發人員增加對生產代碼正常工作的信心,同時也有助於改善代碼設計。Go 語言從誕生那天起就內置 Testing 框架 (以及測試覆蓋率計算工具),基於該框架 ⌘ Read more
sync-Mutex 設計與實現**
概述--sync.Mutex 實現了互斥鎖同步原語。內部實現----我們來探究一下 sync.Mutex 的內部實現,文件路徑爲 $GOROOT/src/sync/mutex.go,筆者的 Go 版本爲 go1.19 linux/amd64。狀態標識變量------const (    mutexLocked = 1 << iota     // 1, 互斥鎖已鎖定    mutexWoken ⌘ Read more
sync-WaitGroup 設計與實現**
概述--sync.WaitGroup 可以等待一個併發執行的 goroutine 集合執行結束。示例--通過一個小例子展示 sync.WaitGroup 的使用方法。package mainimport ( "fmt" "strconv" "sync" "time")type Task struct { ID   int Name string}func main() { tasks := mak ⌘ Read more=
Go 設計模式 -- 備忘錄模式,帶暫存的業務功能可以參考它來實現**
大家好,這裏是每週都在陪你一起進步的網管~!今天繼續學習設計模式—備忘錄模式備忘錄模式(Memento Pattern)又叫作快照模式(Snapshot Pattern), 或令牌模式(Token Pattern), 指在不破壞封裝的前提下, 捕獲一個對象的內部狀態, 並在對象之外保存這個狀態。 這樣以後就可將該對象恢復到原先保存的狀態, 屬於行爲型設計模式。備忘錄模式主要適用於以下應用場景。需要 ⌘ Read more
gin 框架中如何讓日誌文字帶顏色輸出?**
大家好,我是漁夫子。當我們在終端上(比如 Goland)運行 gin 框架搭建的服務時,會發現輸出的日誌是可以帶顏色的。比如下圖中的最後一行,就是請求一個方法時的輸出日誌:我們看到狀態碼 200 和請求的方法 GET 都帶有不同顏色的背景。那麼,這種帶顏色的日誌是如何實現的呢?一、gin 中控制日誌顏色-------------首先,在 gin 框架中提供了控制日誌文字是否帶顏色輸出的方法:Dis ⌘ Read more
gofound 試用**
https://github.com/sea-team/gofound 是純 go 實現的一個類 es 的簡易版本搜索引擎。支持全文檢索引擎 基於平衡二叉樹 + 正排索引、倒排索引實現 可支持億級數據,毫秒級查詢。使用簡單,使用 http 接口。        安裝go get && go build  啓動% ./gofound --addr=:8080 --data=./dat ⌘ Read more
sync-atomic 設計與實現**
概述--atomic 提供了原子同步操作原語,整個過程無需加鎖,也不會產生 goroutine 上下文切換。API---atomic APISwap 操作由 SwapT 系列函數 (例如 SwapInt32, SwapInt64) 實現,等價於如下的原子操作:old = addraddr = newreturn oldCAS 操作由 CompareAndSwapT 系列函數 (例如 Compare ⌘ Read more
golang 源碼分析:httptest**
httptest 是 golang 官方源碼自帶的測試包,它可以非常方便獲取 http 請求結構體,http 返回值結構體,以及在本地啓動一個 loopback 的 server,方便我們做單測。對於 go 的 web 應用程序中往往需要與其他系統進行交互, 比如通過 http 訪問其他系統, 此時就需要一種方法用於打樁來模擬 Web 服務端和客戶端,httptest 包即 Go ⌘ Read more
Go 語言怎麼通過通信共享內存?**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹Go 語言使用 goroutine 和 channel,可以實現通過通信共享內存。本文我們介紹 Go 語言怎麼通過通信共享內存。02goroutine 和 channel在瞭解 Go 語言怎麼通 ⌘ Read more
Go 彙編語言快速入門**
爲什麼要學習彙編語言----------更加接近硬件底層,性能極致優化 降維打擊所有 "高級編程語言" 如果讀者對彙編語言零基礎,建議直接跳轉到文末 Reference 列表,最後兩個鏈接可以作爲入門讀物。概述--Go 彙編語言 並不是一個獨立的語言,因爲其無法獨立編譯和使用。Go 彙編代碼必須以 Go 包的方式組織,同時包中至少要有一個 Go 語言文件用於指明當前包名等基本包信息 ⌘ Read more
寫給 go 開發者的 gRPC 教程 - 安全**
使用 TLS 安全傳輸數據-------------什麼是 SSL/TLS SSL 包含記錄層(Record Layer)和傳輸層 [1],記錄層協議確定傳輸層數據的封裝格式。傳輸層安全協議使用 X.509[2] 認證,之後利用非對稱加密演算來對通信方做身份認證,之後交換對稱密匙作爲會話密匙(Session key[3])。這個會談密匙是用來將通信兩方交換的資料做加密,保證兩個應用間通信的保密 ⌘ Read more
golang 生態下如何設計百萬級別的 websocket 系統**
go websocket 庫介紹Go 有幾個流行的 WebSocket 庫,可以輕鬆地嚮應用程序添加實時通信。讓我們來看看一些最常用的庫以及它們的比較。net/websocket net/websocket 是 Go 標準庫中包含的標準 WebSocket 庫。它提供了一個簡單的 API,用於創建 WebSocket 服務器和客戶端,並支持 WebSocket 協議和較舊的 Hixie 76 ⌘ Read more
singleflight 設計與實現**
概述--singleflight 提供了一套函數重複調用時的抑制機制,經常用來限制併發訪問下的重複請求。例如一個比較常見的場景是使用 singleflight 來限制同一個緩存 key 的重複請求,避免發生 緩存擊穿 時,避免請求全部落到數據庫,減少性能影響和宕機風險。singleflight 示意圖示例--參考 擴展閱讀 列表的文章。內部實現----我們來探究一下 golang.org/x/sy ⌘ Read more
Go sync-Once:簡約而不簡單的併發利器**
大家好,我是 陳明勇,一個熱愛技術,喜歡專研技術的程序員。歡迎關注公衆號:Go 技術乾貨,進羣交流,一起學習,一起進步!簡介在某些場景下,我們需要初始化一些資源,例如單例對象、配置等。實現資源的初始化有多種方法,如定義 package 級別的變量、在 init 函數中進行初始化,或者在 main 函數中進行初始化。這三種方式都能確保併發安全,並在程序啓動時完成資源的初始化。然而,有時我們希望採用延 ⌘ Read more
golang 中的互斥鎖和管道**
sync 包下的互斥鎖 場景:當多個協程對共享變量執行寫操作的時候就會發生資源競爭,需要用互斥鎖。 特點: 互斥鎖必須是全局的,即所有協程共用同一把互斥鎖 在需要寫出執行的代碼中對共享變量的寫操作加鎖。 package mainimport ( "fmt" "sync" "time")// 需求:現在要計算 1-200 的各個數的階乘,並且把各個數的階乘放 ⌘ Read more
Go 構建基礎的事件調度器**
當我們需要在一段時間後的特定時間或間隔運行任務時,我們需要使用任務調度系統來運行任務:例如發送電子郵件、推送通知、午夜關閉賬戶、清空表格等。在本文中,我們將構建一個基本的事件調度程序,使用數據庫作爲持久層來調度事件在特定時間段運行,這將使我們瞭解事件調度系統的工作原理。基本的工作機制是:每當我們需要調度事件時,計劃作業就會添加到數據庫中以在特定時間運行。另一個任務始終定期運行以檢查數據庫中的某些任 ⌘ Read more
goioc:一個使用 Go 寫的簡易的 ioc 框架**
goioc 介紹--------goioc 是一個基於 GO 語言編寫的依賴注入框架,基於反射進行編寫。支持泛型; 簡單易用的 API; 簡易版本的對象生命週期管理,作用域內對象具有生命; 延遲加載,在需要的時候纔會實例化對象; 支持結構體字段注入,多層注入; 對象實例化線程安全,作用域內只會被執行一次。 下載依賴:go get -u github.com/wh ⌘ Read more
Go 環境變量 - GODEBUG 詳解**
簡介\\-\\- GODEBUG 環境變量可以控制程序運行時的調度信息輸出,方便開發者瞭解內部細節。語法是通過逗號分割多個鍵值對,例如: 運行 main.go, 每秒輸出 1 次調度信息$ GODEBUG=scheddetail=1,schedtrace=1000 go run main.go常用參數----\\| 名稱 \\| 值 \\| 描述 \\|\\| --- \\| --- \\| --- \\|\\| scheddetail ⌘ Read more
Go 標準庫中的 HACKING-md 文件**
前言--最近閱讀標準庫源代碼時,偶然間發現 runtime 包下面的一個 markdown 文件,大致讀了一下,感覺對理解 GMP 的基礎概念和各類 註解指令 非常有幫助,決定翻譯出來,正好提高一下自己的英文水平。文件路徑爲 $GOROOT/src/runtime/HACKING.md,筆者的 Go 版本爲 go1.19 linux/amd64。概述--本文檔隨時會更新且有可能隨着時間變化而過時, ⌘ Read more
Go AST 淺析與 CTF 中的實戰運用**
前言-----------在前段時間的網鼎杯某賽道中遇到了一個題,通過混淆的 go 源碼分析各類函數調用、定義信息。但由於題目本身要求獲得的信息過於簡單,有不少人直接暴力搜索來解決。但當我們遇到更爲複雜,更爲巨大的混淆代碼時,IDE 所提供的簡單分析功能也就無能爲力了。這也就是我寫下這篇文章的原因。What are ASTs?------------------------------------ ⌘ Read more
Go 設計模式 -- 訪客模式**
訪客模式也叫訪問者模式(Visitor Pattern)是一種將數據結構對象與數據操作分離的設計模式,可以在不改變數據結構對象類結構的前提下定義作用於這些對象的新的操作, 屬於行爲型設計模式。訪問者模式主要適用於以下應用場景:數據結構穩定,作用於數據結構的操作經常變化的場景。 需要數據結構與數據操作分離的場景。 需要對不同數據類型(元素)進行操作,而不使用分支判斷具體類型的場景。 ⌘ Read more
Go 語言 15 個內置函數詳解**
大家好,我是 frank。 歡迎大家關注「Golang 語言開發棧」公衆號。 01 介紹 Go 語言爲了方便我們開發,提供了 15 個內置函數,比如 len、cap、make 和 new 等。本文我們結合 Go 內置函數官方文檔 [1],介紹一下 Go 語言中的內置函數。02 內置函數 內置函數append:內置函數 append 可以將元素追加到切片的末尾。func append(s ⌘ Read more
一文告訴你當 module path 爲 main 時執行 go test 失敗的真正原因**
近期收到新加入 “Gopher 部落” 知識星球 [1] 的星友 “凌風” 的一個問題,內容如下:在一個目錄下,我編寫了a.go和atest.go,在go mod init main後執行go test,會報錯:could not import main( can not import "main")。我知道它的解決方法是改變包名。我的問題是:1. 難道無法對 main 包執行包內測試了麼。2. ⌘ Read more
Go 語言切片是如何擴容的?**
在 Go 語言中,有一個很常用的數據結構,那就是切片(Slice)。切片是一個擁有相同類型元素的可變長度的序列,它是基於數組類型做的一層封裝。它非常靈活,支持自動擴容。切片是一種引用類型,它有三個屬性:指針,長度和容量。底層源碼定義如下:type slice struct {    array unsafe.Pointer    len   int    cap   int}指針: 指向 slic ⌘ Read more
Go 語言標準庫 bufio 詳解**
01 介紹Go 語言標準庫 bufio 是基於 Go 語言標準庫 io 實現的,查看源碼可以發現,實際上它是包裝了 io.Reader 接口和 io.Writer 接口,並且實現它們。bufio 顧名思義,就是在緩衝區讀寫數據,比直接讀寫文件或網絡中的數據,性能更好些。本文我們介紹 bufio 的相關內容,建議讀者朋友們最好是先了解一下 io 的相關內容。02 標準庫 bufio 的數據類型查看標 ⌘ Read more
使用 go test 框架驅動的自動化測試**
一. 背景-----團隊的測試人員稀缺,無奈只能 “自己動手,豐衣足食”,針對我們開發的系統進行自動化測試,這樣既節省的人力,又提高了效率,還增強了對系統質量保證的信心。我們的目標是讓自動化測試覆蓋三個環境,如下圖所示:我們看到這三個環境分別是:CI/CD 流水線上的自動化測試 發版後在各個 stage 環境中的自動化冒煙 / 驗收測試 [1] 發版後在生產環境的自動化冒煙 / 驗收測 ⌘ Read more
Go Mutex:保護併發訪問共享資源的利器**
大家好,我是 陳明勇,一個熱愛技術,喜歡專研技術的程序員。歡迎關注公衆號:Go 技術乾貨,一起學習,一起進步!前言Go 語言以 高併發 著稱,其併發操作是重要特性之一。雖然併發可以提高程序性能和效率,但同時也可能帶來 競態條件 和 死鎖 等問題。爲了避免這些問題,Go 提供了許多 併發原語,例如 Mutex、RWMutex、WaitGroup、Channel 等,用於實現同步、協調和通信等操作。本 ⌘ Read more
學會 Go select 語句,輕鬆實現高效併發**
哈嘍大家好,我是陳明勇,本文介紹的內容是 Go select 語句。如果本文對你有幫助,不妨點個贊,如果你是 Go 語言初學者,不妨點個關注,一起成長一起進步,如果本文有錯誤的地方,歡迎指出!前言在 Go 語言中,Goroutine 和 Channel 是非常重要的併發編程概念,它們可以幫助我們解決併發編程中的各種問題。關於它們的基本概念和用法,前面的文章 一文初探 Goroutine 與 cha ⌘ Read more
Go 語言數組和切片的區別**
在 Go 語言中,數組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。另外,這個問題在面試中也經常會被問到,屬於入門級題目,看過文章之後,相信你會有一個很好的答案。數組--數組是同一種數據類型元素的集合,數組在定義時需要指定長度和元素類型。例如:[4]int 表示一個包含四個整數的數組,數組的大小是固定的。並且長度是其類型的一部分([4]int 和 [5]int ⌘ Read more
gin 框架中 Context 的 Get、Query、Param 函數都是從哪裏獲取數據的?**
大家好,我是漁夫子。在使用 gin 框架處理一次請求的過程中,可以通過 Context 結構體提供的方法獲取或設置一個指定 key 的值。在 Context 中有多個通過 key 獲取值的函數:GetString(key string) (s string)、Param(key string) string、Query(key string) (value string)、PostForm(key ⌘ Read more
Go 如何自動解壓縮包?**
在開發過程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用 Go 語言自動解壓縮包和讀取 docx/doc 文件。一、解壓縮包------壓縮包格式常見的壓縮包格式有 zip、gzip、bzip2 等。在 Go 語言中,使用 archive/zip、compress/gzip、compress/bzip2 包可以輕鬆地處理這些格式的文件。解壓 zip 文件使用 archive/zip ⌘ Read more
Go 調試工具 - delve 快速入門**
簡介\\-\\- Delve 用來調試 Go 語言開發的程序,該工具的目標是爲 Go 語言提供一個簡單、功能齊全的調試工具。爲什麼不推薦 gdb----------• gdb 對 Go 的調試支持是通過一個 python 腳本文件 src/runtime/runtime-gdb.py 擴展的,功能有限 • gdb 只能做到最基本的變量打印,卻理解不了 golang 的一些特殊類型,比如 chann ⌘ Read more
爲什麼有了 Go module 後 “依賴地獄” 問題依然存在**
本文永久鏈接 – https://tonybai.com/2022/03/12/dependency-hell-in-go如果所有 Gopher 都拋棄 GOPATH 構建模式,擁抱 Go module 構建模式;如果所有 legacy Go package 作者都能爲自己的 legacy package 加上 go.mod;如果所有 Go module 作者都嚴格遵守語義版本 (semver) ⌘ Read more
雲原生系列 Go 語言篇 - 併發**
併發是一個計算機科學用語,將一個進程分割成獨立組件並指明這些組件如何安全共享數據。大部分語言通過庫提供併發,使用的是嘗試通過獲取鎖操作執行系統級共享數據的線程。Go 獨樹一幟。它的主要併發模塊,很多認認爲是 Go 的最著名的特性,基於 CSP(通訊順序過程)。它依據快速排序算法的發明人 Tony Hoare 在 1978 年的論文所描述的併發風格。根據 CSP 實現的模式和標準併發同樣強大,但容易 ⌘ Read more
一分鐘搞明白!快速掌握 Go WebAssembly
大家好,我是煎魚。最近因爲各種奇怪的原因,更多的接觸到了 WebAssembly。雖然之前很多博客也翻過寫過各種文章,但總感覺欠些味道。於是今天梳理了一版,和大家一起展開學習。先來一張經典圖:WebAssembly 是什麼---------------以下是 Mozilla 在 MDN 上給出的定義: WebAssembly(縮寫:Wasm)是一種新的編碼方式,可以在現代的網絡瀏覽器中運行 - ⌘ Read more
go 中的平滑關閉究竟是怎麼關閉的**
關閉軟件可以分爲平滑關閉(軟關閉)和硬關閉。就像我們在關閉電腦的時候,有時候遇到電腦死機,會直接長按開關鍵,直至電腦關機,這就是硬關機。而通過電腦上的菜單選擇 “關機”,則屬於軟關機(平滑關閉)。在軟關機的時候,大家應該會注意到時間會比較長,時不時還會有彈窗彈出 詢問是否要退出。在我們自己編寫的 web 應用中,實際上也是需要有軟關閉的。今天我就 golang 中的 gin 框架爲例,來聊聊平滑關 ⌘ Read more
「Go 工具箱」Pie :一個高性能、類型安全的 slice 操作庫**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。在 Go 語言中,對 slice 和 map 是我們最常用的數據結構。比如,計算兩個切片的交集、差集;判斷切片中的元素是否都滿足某個條件的等。我推薦大家使用這個包:elliotchance/pie。以下是該包的基本情況:cuklbQ使 ⌘ Read more
Go 語言併發模式代碼模板**
前言文章代碼量較多,如果是初次閱讀,建議瞭解每種模式的基礎用法即可,工作中有實際的應用開發場景時,再回來研究代碼細節。經典模式 (pipeline + selector)這裏有一個來自 Go 官方博客的例子,通過管道篩選質數並打印。質數篩選器第一個版本-----package mainimport "fmt"// 生成數字併發送到通道func generate(ch chan int) { ⌘ Read more
Go 語言自帶設計模式**
概述\\-\\- 在軟件工程中,設計模式(design pattern)是對軟件設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。 -- 維基百科和傳統的 GOF, Java, C# 教科書式的 設計模式 不同,Go 語言設計從一開始就力求簡潔,有其他編程語言基礎的讀者在學習和使用 Go 語言時, 萬萬不可按圖索驥、生搬硬套,簡單的事情複雜化。本文帶領大家一起看一下,Go 語言標準庫中自帶的 編程 ⌘ Read more
深入解析 nbio 框架**
圖片拍攝於 2023 年 3 月 18 日 杭州大屋頂所到之處處處皆 Ai,所見之人人人皆唸咒。之前更新的一系列,好久沒更新了,差點爛尾,我不允許這樣的事情在我身上發生 (雖然已經爛尾好幾次了😭)。evio 原理解析~有彩蛋 Go 網絡庫 Gnet 解析 Go netpoll 大解析在上一篇文章中,我們探討了基於 epoll 的 Go Netpoll 框架的早期實現——evio。我們還指出了它 ⌘ Read more
Go 語言 new 和 make 關鍵字的區別**
本篇文章來介紹一道非常常見的面試題,到底有多常見呢?可能很多面試的開場白就是由此開始的。那就是 new 和 make 這兩個內置函數的區別。其實這個問題本身並不複雜,簡單來說就是,new 只分配內存,而 make 只能用於 slice、map 和 chan 的初始化,下面我們就來詳細介紹一下。new---new 是一個內置函數,它會分配一段內存,並返回指向該內存的指針。其函數簽名如下:源碼// T ⌘ Read more
Go sync-Pool 保姆級教程**
Pool's purpose is to cache allocated but unused items for later reuse, relieving pressure on the garbage collector. That is, it makes it easy to build efficient, thread-safe free lists. However, it is ⌘ Read more
聊聊 godoc、go doc 與 pkgsite
查看文檔是開發人員日常必不可少的開發活動之一。Go 語言從誕生那天起就十分重視項目文檔的建設,爲此 Go 爲 gopher 們提供了多種豐富的文檔查看工具,除了在 Go 官方網站 [5] 可以在線查看到最新穩定發佈版的文檔之外,Go 還爲開發人員提供了本地離線查看文檔的工具,比如:godoc[6]、go doc 以及 pkgsite[7]。在這篇短文中,我們就來分別看看這三個 Go 文檔查看工具。 ⌘ Read more
Go 語言實現創建型設計模式 - 單例模式**
01 介紹單例模式(Singleton Pattern)是一種創建型設計模式,它確保一個類只有一個實例,並提供一個全局訪問點。因爲它同時解決了兩個問題,所以它違反了單一職責原則。02 使用場景什麼場景適合使用單例模式呢?某個類對於所有客戶端只有一個可用的實例比如記錄應用程序的運行日誌,因爲記錄日誌的文件只有一個,所以只能有一個日誌類的實例向日志文件中寫入,否則會出現日誌內容互相覆蓋的問題。需要更加 ⌘ Read more
你是否因使用姿勢不當,而在 WaitGroup 栽了跟頭?**
在 Go 中,sync 包下的 WaitGroup 能有助於我們控制協程之間的同步。當需要等待一組協程都執行完各自任務後,才能繼續後續邏輯。這種場景,就非常適合使用它。但是,在使用 WaitGroup 的過程中,你可能會犯錯誤,下文我們將通過示例逐步探討。任務示例----初始任務假設我們有以下任務 woker,它執行的任務是將參數 msg 打印出來。func worker(msg string) ⌘ Read more
一文搞懂 Go subtest
本文永久鏈接 [2] - https://tonybai.com/2023/03/15/an-intro-of-go-subtest單元測試 (unit testing)[3] 是軟件開發中至關重要的一環,它存在的意義包括但不限於如下幾個方面:提高代碼質量:單元測試可以確保代碼的正確性、可靠性和穩定性,從而減少代碼缺陷和 bug。 減少迴歸測試成本:在修改代碼時,單元測試可以快速檢查是否影響 ⌘ Read more
Go 語言中部分實現的接口 -技巧-**
你好,我是小四,你情商高,也可以叫我四哥~Go 語言不同於我們所知道的其他語言,比如 Java、C# 等。常常使用鴨子類型處理依賴關係。通過聲明一個本地接口,指定想要依賴的方法,但是不提供具體的實現,就像下面這樣:// Notice that the interface does not even need to be exported// for an outside dependency to ⌘ Read more
Go 項目 2 次架構演變,算是入了微服務的門吧!**
作者:Ciusyan https://juejin.cn/post/7203247258850312251一、初見 Dousheng (1)架構思路因爲自己以前是一個Javer,對傳統的MVC三層架構還算比較熟悉,就巨石架構而言,使用MVC的架構方式,模塊還算是比較清晰了。因爲接觸了一門新的語言GoLang,利用一些熟悉的事物過渡到不太熟悉的領域。是我們人性所擅長的。所以在 Doush ⌘ Read more
Go 協程池 -2-: 如何實現協程池**
線程池的出現,是因爲頻繁地創建和銷燬線程開銷比較大。通過線程池,一個線程不僅僅是處理一個任務就被銷燬,而是可以處理多個任務,任務被處理完時才被銷燬。下圖是 Java ExecutorService 類的結構:Java ExecutorService協程池的作用是一樣的,實現原理當然也一樣。一個協程池的數據結構,在邏輯上必須 3 類數據:協程池的容量 task pool 任務池 work ⌘ Read more
Go 協程池 -1-: 線程 vs 協程**
衆所周知,Goroutine(也叫協程) 運行在用戶態,由 Go runtime 管理。而操作系統線程同時處於用戶態和內核態。兩者的差別體現在四個方面:數據結構 創建時的內存佔用 運行時狀態 上下文切換 數據結構對於每個線程,內核中都維護一個 taskstruct 對象,它還有一個名字叫 thread control block,簡稱 TCB。這個結構中記錄了線程當前的 ⌘ Read more
Golang 整潔架構實踐**
作者:donghli,騰訊 PCG 後臺開發工程師 瞭解過 Hex 六邊形架構、Onion 洋蔥架構、Clean 整潔架構的同學可以將本篇文章介紹的實踐方法與自身項目代碼架構對比並互通有無,共同改進。沒了解過上述架構的同學可以學習一種新的架構方法,並嘗試將其應用到業務項目中,降低項目維護成本,提高效率。本文提及的架構主要指項目組織的 “代碼架構”,注意與微服務架構等名詞中的服務架構進行區分。1. ⌘ Read more
Go 中的性能分析和執行跟蹤**
Go 提供了一些優秀的診斷工具來幫助我們深入分析應用程序的執行情況。這篇文章核心關注點是:分析和執行跟蹤器。 這兩個工具都非常重要,它們應該成爲任何對優化感興趣的 Go 開發人員的核心工具集的一部分。 首先,我們來討論下性能分析。性能分析 Profiling------------------分析工具提供了對應用程序執行的洞察力。它使我們能夠解決性能問題、檢測競爭、定位內存泄漏等。這些信息可以通過 ⌘ Read more
eCapture 旁觀者支持 Golang tls-https 加密明文捕獲**
前言云原生生態中,golang 語言開發的項目越來越多,例如 Docker 和 K8s、etcd 等。作爲 SRE、RD,偶爾需要在生產環境抓網絡通訊包,用來分析排查故障。很多時候,都是 tls/https 加密協議,如何在不重啓業務保留現場,不改爲自定義 CA 證書的情況下,分析明文通訊內容呢?適用場景eCapture 0.5.0 版本在 2023 年 3 月 12 日發佈,支持了 go 語言編 ⌘ Read more
如何在 Go 使用 interface
簡述--編寫靈活的、可重複使用的、模塊化的代碼對於開發多功能的程序至關重要。以這種方式開發,可以避免在多個地方做同樣的修改,從而確保代碼更容易維護。如何完成這個目標,不同語言有不同的實現方法來完成這個目標。例如,繼承 [1] 是一種常見的方法,在 Java、C++、C# 等語言中都有使用。開發者們也可以通過組合 [2] 實現這個設計目標。組合是一個將多個對象和數據類型組合到一個複雜的結構體中的方 ⌘ Read more
Go for range 一不下心就掉坑**
前言 for 循環問題,在面試中經常都會被問到,並且在實際業務項目中也經常用到 for 循環,要是沒用好,一不下心就掉坑。下面會挑選幾個經典的案例,一塊來探討下,看看如何避免掉坑,多積累積累採坑經驗。案例一:for + 傳值------------先來到開胃菜,熱熱身~type student struct {  name string  age  int}func main() {  m := ⌘ Read more
=
dynamicgo 開源 :基於原始字節流的高性能 - 動態化 Go 數據處理**
倉庫地址:https://github.com/cloudwego/dynamicgo01背景當前,Thrift 是字節內部主要使用的 RPC 序列化協議,在 CloudWeGo/Kitex 項目中優化和使用後,性能相比使用支持泛型編解碼的協議如 JSON 有較大優勢。但是在和業務團隊進行深入合作優化的過程中,我們發現一些特殊業務場景並不能享受靜態化代碼生成所帶來的高性能:動態反射:動態地 讀 ⌘ Read more
Go 語言中的嵌入【第二部分】:接口嵌入接口**
你好,我是小四,你情商高,也可以叫我四哥~接口嵌入接口在一個接口裏面嵌入另一個接口,是 Go 語言裏最簡單的一種嵌入方式,因爲接口只定義了抽象能力,並沒有爲類型定義新的數據和行爲。我們先看 Effective Go[1] 裏列的示例,一個衆所周知的 Go 標準庫中嵌入接口的示例,給出 io.Reader 和 io.Writer 接口:type Reader interface {    Read( ⌘ Read more
Go 語言中的嵌入【第一部分】:結構體嵌入結構體**
你好,我是小四,你情商高,也可以叫我四哥~Go 語言並不支持傳統意義上的繼承,相反,它提倡通過組合來擴展類型的功能。這並不是 Go 所特有的概念,繼承之上的組合是 OOP 的一個衆所周知的原則,在《設計模式》一書的第一章就有介紹。Embedding(嵌入) 是 Go 語言一個重要的特性,有了它使得組合更加方便、更有用。雖然 Go 力求簡單,但某種程度上嵌入增加了語言的複雜度,如果使用不當會導致 b ⌘ Read more
寫給 go 開發者的 gRPC 教程 - 超時控制**
導言 一個合理的超時時間是非常必要的,它能提高用戶體驗,提高服務器的整體性能,是服務治理的常見手段之一爲什麼要設置超時--------用戶體驗:很多 RPC 都是由用戶側發起,如果請求不設置超時時間或者超時時間不合理,會導致用戶一直處於白屏或者請求中的狀態,影響用戶的體驗資源利用:一個 RPC 會佔用兩端(服務端與客戶端)端口、cpu、內存等一系列的資源,不合理的超時時間會導致 RPC ⌘ Read more
golang 源碼分析:自定義 proto 插件**
在使用 protoc 的時候,可以通過指定不同的插件來生成不同的代碼,它的參數統一是 xxout 結尾的,制定了插件參數,就會到 path 下搜索 protoc-gen-xx 的插件。比如 protoc 通過 --fooout 搜索插件 可執行文件 protoc-gen-foo, 也可使用參數 protoc --plugin=protoc-gen-foo=/path/to/prot ⌘ Read more
Go 高性能 - 逃逸分析**
逃逸分析Go 語言的編譯器使用 逃逸分析 決定哪些變量分配在棧上,哪些變量分配在堆上。在棧上分配和回收內存很快,只需要 2 個指令: PUSH + POP, 也就是僅需要將數據複製到內存的時間,而堆上分配和回收內存,一個相當大的開銷是 GC。特性--• 指向 棧 對象的指針不能分配堆上 (避免懸掛指針) • 指向 棧 對象的指針在對象銷燬時必須被同時銷燬 (避免懸掛指針和內存泄露) 例 ⌘ Read more
Go 程序的生前死後**
作者: 絕了 https://juejin.cn/post/7202149834362585145最近想寫一篇 GC 的文章,寫着寫着發現沒有 GMP 調度模型和 Memory Model 的知識,gc 就很難寫下去,然後就又去看 GMP 模型,然後發現 GMP 的起點還是得看 g0、m0 這幾個關鍵數據,這幾個數據又是在程序啓動時初始化的,然後發現 GC 和 Memory Model ⌘ Read more
在 Gin 中使用中間件進行全局錯誤處理**
3 自定義錯誤結構首先自定義如下錯誤結構體,包含 code、msg 和 data,data 用以提供附加的錯誤信息,比如提示 300 參數錯誤時 data 可提示具體的參數錯誤信息。按照 golang 的接口實現規則,只要 MyError 結構體實現了 Error() string 方法就可被視作實現了標準 error 接口。package errorstype MyError struct { ⌘ Read more
【譯】Go 語言:使用 Singleflight 優化你的代碼**
你好,我是小四,你情商高,也可以叫我四哥~介紹有很多方法可以優化代碼以達到提高程序運行效率,減少進程數就是其中之一。在這篇文章中,我們將學習如何通過使用 Go 語言的 Singleflight 包減少重複的進程來優化 Go 代碼。問題假設你有一個 web 應用,每秒鐘處理 10 個請求。根據數據觀察其中一些請求是重複的,意味着可以減少請求的進程。從上圖可以看出,user1 和 user2 請求相同 ⌘ Read more
可觀察性與性能在 go 中的實踐**
先測量“過早的優化是萬惡之源”——Donald KnuthGo 有兩個在性能調優方面非常寶貴的工具:一個分析器和一個基準測試工具。探查器幫助找到問題點,基準顯示優化的結果。有關這些工具的介紹,請參閱 Dave Cheney 的 How to write benchmarks in Go 和 Russ Cox 的 Profiling Go Programs 。下面是我在基準測試和分析器中發現的幾種具 ⌘ Read more
一文帶你瞭解 Go mod!**
什麼是 Go mod? go mod 是 Go 語言的模塊管理工具, 可用來代替傳統的 GOPATH。go mod 和 GOPATH 的區別有哪些?go mod 的代碼開發不侷限於某一個目錄,GOPATH 的代碼開發必須在 GOPATH 的 src 目錄下 go mod 的依賴無需手動管理,可執行一條命令後自動管理依賴, GOPATH 的包依賴需要一個一個解決 go mod 在使用之前 ⌘ Read more
寫給 go 開發者的 gRPC 教程 - metadata
導語 和在普通HTTP請求中一樣,gRPC 提供了在每一次 RPC 中攜帶上下文的結構:metadata。在 Go 語言中,它與context.Context緊密結合,幫助我們實現服務端與客戶端之間互相傳遞信息什麼是 metadata?---------------gRPC 的 metadata 簡單理解,就是 HTTP Header  中的 key-value 對metadata 是 ⌘ Read more
Go 高性能 - 打印調用堆棧**
概述在工程代碼中需要在異常場景打印相應的日誌,記錄重要的上下文信息。如果遇到 panic 或 error 的情況, 這時候就需要詳細的 堆棧信息 作爲輔助來排查問題,本小節就來介紹兩種常見的獲取 堆棧信息 方法, 然後對兩種方法進行基準測試,最後使用測試的結果進行性能對比並分析差異。runtime.Stack通過標準庫提供的 runtime.Stack 相關 API 來獲取。示例--package ⌘ Read more
Go 包管理講解**
大部分編程語言都有其代碼組織方式,以方便管理我們所開發的代碼,比如PHP的命名空間(namespace),Java的package,JavaScript的module;Go 語言也有自己的代碼組織方式:包 (package)。Go 語言包管理歷史----------Go語言包管理歷史主要有以下幾個階段:GOPATH時代:項目放在GOPATH環境變量所配置的目錄下的src目錄中。 vendor ⌘ Read more
爲什麼 Go 語言 struct 要使用 tags
在 Go 語言中,struct 是一種常見的數據類型,它可以用來表示複雜的數據結構。在 struct 中,我們可以定義多個字段,每個字段可以有不同的類型和名稱。除了這些基本信息之外,Go 還提供了 struct tags,它可以用來指定 struct 中每個字段的元信息。在本文中,我們將探討爲什麼 Go 語言中需要使用 struct tags,以及 struct tags 的使用場景和優勢。str ⌘ Read more
Go 語言開源 RPC 服務治理框架**
介紹--RPCX 是當前最流行的 Go 生態圈的微服務框架之一,很多大廠和創業公司都在使用,並且服務端無需額外配置,RPCX 也同時支持 HTTP 調用,這樣其它編程語言都可以調用 RPCX 服務, 是目前性能最好的 RPC 框架之一。功能特性----• 簡單易用:易於入門, 易於開發, 易於集成, 易於發佈, 易於監控 • 高性能:性能遠遠高於 Dubbo、Motan、Thrift 等框架 ⌘ Read more
Go 應用服務疑似內存泄露問題排查**
作者:SFLYQ https://juejin.cn/post/7195857732846698557背景爲了保障業務的可用性,增加應用服務請求依賴服務(grpc、http)的熔斷降級策略,避免依賴服務不可用的情況下,出現級聯服務故障產生雪崩,通過熔斷降級儘可能把影響縮放到最小。因此需要在 go 應用服務中接入熔斷組件,組件我們選擇了:阿里開源的 sentinel circuitbrea ⌘ Read more
用 Go 語言 0 代碼 10 分鐘完成一個學生管理系統帶頁面,私活必備**
大家好,我是小熊。今天到明天就有好多學生朋友開學了,很多人痛苦不堪精神恍惚捶胸頓足,作爲過來人勸大家一定要看開,畢竟等以後工作了每週的週一都會這樣的。# 不止週一,是每個工作日#今天給大家介紹下各個沒聽過的功能。回憶往昔----上次給大家講了 5 分鐘啓動一個項目,使用到的是go-gin-api這個開源項目。他可能給我們提高很多的開發效率,來看看他寫業務代碼要幾步。數據庫寫 DDL 創建表結構 ⌘ Read more
深入理解 go sync-Con
在 go 的標準庫中,提供了 sync.Cond 這個併發原語,讓我們可以實現多個 goroutine 等待某一條件滿足之後再繼續執行。 它需要配合 sync.Mutex 一起使用,因爲 Cond 的 Wait 方法需要在 Mutex 的保護下才能正常工作。 對於條件變量,可能大多數人只是知道它的存在,但是用到它的估計寥寥無幾,因爲很多併發場景的處理都能使用 chan 來實現, 而且 chan 的 ⌘ Read more
8 千字詳解 Go1-20 穩定版**
Go1.20 變化不少,該版本依然保持 Go1 兼容性,我們可以升級到 Go1.20,而不需要做任何代碼改動。可以使用你任何喜歡的方式升級: 比如:go install golang.org/dl/go1.20@latest具體的可以參考官網教程:https://go.dev/doc/go1.20Go 1.20 簡介----------最新的 Go 版本 1.20 在 Go 1.19 發佈六 ⌘ Read more
一文喫透 Go 內置 RPC 原理**
hello 大家好呀,我是小樓,這是系列文《Go 底層原理剖析》的第三篇,依舊分析 Http 模塊。我們今天來看 Go 內置的 RPC。說起 RPC 大家想到的一般是框架,Go 作爲編程語言竟然還內置了 RPC,着實讓我有些喫鯨。從一個 Demo 入手爲了快速進入狀態,我們先搞一個 Demo,當然這個 Demo 是參考 Go 源碼 src/net/rpc/server.go,做了一丟丟的修改。首先 ⌘ Read more