# Twtxt is an open, distributed microblogging platform that # uses human-readable text files, common transport protocols, # and free software. # # Learn more about twtxt at https://github.com/buckket/twtxt # # This is an automated Yarn.social feed running feeds v0.1.0@2b75e86 # Learn more about Yarn.social at https://yarn.social # # nick = yue-fang-readfog-go # url = https://feeds.twtxt.net/yue-fang-readfog-go/twtxt.txt # source = https://www.readfog.com/t/go/feed # avatar = https://feeds.twtxt.net/yue-fang-readfog-go/avatar.png#vb4wqhdj5rsuracksspo5ewnd47jagkxwt5c4n4hh67ohxqtio5a # description = # updated_at = 2022-07-01T10:49:52Z # 2022-05-23T15:12:31Z **Go 適合 IO 密集型?並不準確!**
Go 程序適合什麼樣的場景?你想過這個問題嗎?Go 程序到底是哪種場景最適合。可能你已經聽說過答案了:IO 密集型的場景。什麼是 CPU 密集型、IO 密集型?計算機程序場景會分成 cpu 密集型 和 IO 密集型。CPU 密集型說的是一直在運算 CPU 指令,這種常見於算法運行嘍。IO 密集型說的是經常下發 IO ,比如網卡,磁盤,或者其他外設。Go 適合 IO 密集型,並不準確?你肯定記住了答 ⌘ [Read more](https://www.readfog.com/a/1669639779973697536) 2022-05-24T01:54:49Z **10- 條 Go 官方諺語,你知道幾條?**
作爲一個 Go 語言開發工程師,總是在入門、深入、撕提案時能夠聽到各種帶有 Go 特色的話語,例如:少即是多(less is more),非常有趣。今天帶來了 Go 語言之父 Rob Pike 在 2015 年分享的主題《Go Proverbs》,它在該主題中講了的 10+ 條 Go 諺語,希望大家可以用上。核心理念是:簡單、詩意、簡潔(Simple, Poetic, Pithy)。諺語 = ⌘ [Read more](https://www.readfog.com/a/1669680189886533632) 2022-05-24T01:54:02Z **類型安全的 Go HTTP 請求**
前言--對 Gopher 來說,雖然我們基本都是在寫代碼讓別人來請求,但是有時候,我們也需要去請求第三方提供的 RESTful 接口,這個時候,我們才能感受到前端同學拼接 HTTP 請求參數的痛苦。比如,我們要發起類似這樣一個請求,看起來很簡單,實際寫起來還是比較繁瑣的。POST /articles/5/update?device=ios HTTP/1.1Host: go-zero.devAuth ⌘ [Read more](https://www.readfog.com/a/1669680140742922240) 2022-05-24T11:06:17Z **自動發現 Go 項目 Bug 的神器**
大家好,我是程序員幽鬼。Go1.18 新特性中有一個神器:Fuzzing,對於發現 Go 項目中的 Bug 很有幫助。本文通過一個具體的例子來介紹它的基本使用,希望你能掌握並應用。以下這個函數,你能找到幾個 bug?它的功能看起來很簡單——對於一個字符串,用一個新的用戶定義字符覆蓋它的第一個字符 n 次。例如,如果我們運行OverwriteString("Hello, World!", "A", ⌘ [Read more](https://www.readfog.com/a/1669714885342236672) 2022-05-24T11:16:10Z **Go MongoShake 數據同步工具**
MongoShake 是一個以 golang 語言進行編寫的通用的平臺型服務,通過讀取 MongoDB 集羣的 Oplog 操作日誌,對 MongoDB 的數據進行復制,後續通過操作日誌實現特定需求。日誌可以提供很多場景化的應用,爲此,我們在設計時就考慮了把 MongoShake 做成通用的平臺型服務。通過操作日誌,我們提供日誌數據訂閱消費 PUB/SUB 功能,可通過 SDK、Kafka、Met ⌘ [Read more](https://www.readfog.com/a/1669715506562699264) 2022-05-25T06:41:57Z **面試官提問三個 Go 接口的概念,10 年 gopher 竟無言以對**
自 Go 1.18 後, Go 的 interface 的含義有所變化, 三個新的和 Go 接口有關的概念很多人還不知道: type set(類型集合)、specific type(特定類型) 和structural type(結構類型)。1 type set (類型集合)---------------------type set 稱之爲類型集合,一些關注 Go 泛型的朋友其實也對此有些瞭解,它是 ⌘ [Read more](https://www.readfog.com/a/1669788852122914816) 2022-05-25T14:02:38Z **Go 科學計算之向量篇 - Gonum 實現**
出於某種目的,有時候我們會將簡單的事物複雜化,但其複雜程度不應該超出多數人的理解範圍。本文原本試圖分別對 Gonum 和 Gosl 兩個主要 Go 語言科學計算包關於向量的實現及其基本運算進行整理分析。本文介紹 Gonum。‌申明:由於時間和精力有限,本文缺失文獻整理部分,如果有侵權之嫌,望及時告知; 由於能力有限,請務必對本文持批判態度,盡信書不如無書。 預備知識----爲了便於理解 ⌘ [Read more](https://www.readfog.com/a/1669816577190629376) 2022-05-25T14:16:50Z **Gorm scope 實現分頁**
Gorm 是一個非常棒的 ORM。今天,我將向您展示如何使用 Gorm Scopes 創建分頁。 Scopes 可以實現一些邏輯的複用,這些邏輯需要定義爲如下格式:func(gorm.DB) gorm.DB首先創建一個 Pagination 結構體:type Pagination struct { PageSize int json:"pageSize,omitempt ⌘ [Read more](https://www.readfog.com/a/1669817470520758272) 2022-05-25T14:16:16Z **Go:基於 Redis Stream 構建可擴展事件流**
事件流架構是獨立擴展某些組件的好方法。當提到事件流工具時,這方面的主流似乎是 Kafka,但也有一些其他實用的流工具,比如 NATS 流 / Jetstream, NSQ 或 Redis 流。今天我將寫一些關於 Redis Stream 基本用法的筆記,我們將構建一個發佈者和一個消費者的例子,並使用運行在 docker 上的 Redis 服務器做本地測試。發佈者將使用 XADD 命令發送一些消息到 ⌘ [Read more](https://www.readfog.com/a/1669817434648973312) 2022-05-25T14:31:36Z **一篇文章帶你搞定 Go 語言基礎之文件操作**
前言--Hey,大家好呀,我是 Go 進階者,這次咱們來說一下文件操作。文件操作就簡單了,像打開 word 了,excel 了,都是文件操作,當然,我們肯定是不能直接操作 word 的我們就從最簡單的普通文件開始叭!打開和關閉文件-------package mainimport "os"func main() { //os.Open是隻讀模式 fileObj, err := os.O ⌘ [Read more](https://www.readfog.com/a/1669818399208869888) 2022-05-25T14:30:29Z **數據庫遷移工具 golang-migrate**
1 項目地址https://github.com/golang-migrate/migrate2 使用情景一些項目功能會涉及到數據庫和代碼邏輯的修改,對於數據庫的修改,雖然 gorm 之類的工具能夠在代碼裏面適配大部分情況,但是不能覆蓋所有數據庫變更情況,而且也不夠清晰。爲清楚表示某次代碼提交設計的數據庫的修改並且方便 devops 部署服務,可以使用 golang-migrate 這樣的工具明確 ⌘ [Read more](https://www.readfog.com/a/1669818329273044992) 2022-05-25T14:25:59Z **可替代 Jenkins:Drone 進一步簡化 CI-CD**
創建一家成功的軟件公司需要什麼?交付有價值的軟件並快速交付的能力。我們如何保證這種高速服務?持續交付 (CD) 流程,由完善的持續集成 (CI) 機制支持,以提供完美交付,尤其是當平臺組件的數量和依賴性增加時。這張圖片完美地總結了良性 CI/CD 循環,任何 DevOps 都應該將其貼在辦公桌上:在本文中,我們將關注循環的左側,即產品從代碼到測試的過程。使用源代碼時,git 是唯一的選擇。事實上, ⌘ [Read more](https://www.readfog.com/a/1669818046174302208) 2022-05-26T03:07:28Z **Go struct tag 能否設置默認值?**
struct tag 默認值 1. 需求背景有時候 gopher 在 marshal 一個 struct 到 json 的時候,想要 struct 某些屬性在沒有值的情況下有默認值,但是按照現在 marshar 的作用下不會給 struct 的屬性賦默認值,所以爲了解決這個特殊需求,我們應該按照以下方案來解決。2. 解決方案 利用反射,因爲通過反射,我們可以拿到 tag 屬性,進而對默認字段做 ⌘ [Read more](https://www.readfog.com/a/1669865954186727424) 2022-05-26T03:09:22Z **Go 中你是如何進行類型轉換的?**
簡介--今天介紹 spf13 大神的一個庫 cast。cast是一個小巧、實用的類型轉換庫,用於將一個類型轉爲另一個類型。最初開發cast是用在 hugo 中的。快速使用----先安裝:$ go get github.com/spf13/cast後使用:package mainimport ( "fmt" "github.com/spf13/cast")func main() { // To ⌘ [Read more](https://www.readfog.com/a/1669866074349342720) 2022-05-27T03:03:45Z **go 全棧開發框架 bud,go 語言中的 ruby on rails**
介紹 Bud是一個 go 語言編寫的全棧開發框架,類似ruby on rails,Bud的使命是降低構建、開發和維護 web 應用的成本。Bud提供了一整套文檔完善的、充分測試的工具來降低 web 應用開發成本。安裝 curl -sf https://raw.githubusercontent.com/livebud/bud/main/install.sh \| shbud -h創建 w ⌘ [Read more](https://www.readfog.com/a/1669956318030565376) 2022-05-27T03:08:25Z **一個 Benchmark 比較分析工具 benchstat**
在 Go 中,通過撰寫 Benchmark 函數可以很方便地對某個功能點進行性能檢測。對於重要的函數,我們可以在 CI/CD 中添加相應的測試流程,當函數性能發生變化時能夠及時感知。那問題來了,如何檢測函數的性能變化? 換個說法,你編寫了某功能函數但發現它運行很慢,需要對該函數進行優化,當你在谷歌搜索找到更好的實現方式,通過 Benchmark 函數發現它的確變快了。但你說不清楚具體變快了多少, ⌘ [Read more](https://www.readfog.com/a/1669956611714682880) 2022-05-27T15:49:09Z **Go 併發之 M-P-G 定義及狀態轉換**
【導讀】本文從 go 源碼觸發,詳細介紹了 MPG 模型的定義和狀態轉換。從這篇文章開始我將嘗試從源碼的角度解析 Go 語言併發之道。這次的源碼解析可比 python 源碼解析難度要大的多。鄙人不才,有問題還請指教。Go 程序入口——m0、g0-----------------go 語言併發模型調度器的源碼大多集中在 / runtime / 文件夾之下。此文件夾之下有很多文件。包括 .s 類型的彙 ⌘ [Read more](https://www.readfog.com/a/1670004472633462784) 2022-05-30T02:23:40Z **將 Go 語言當成腳本來使用 - gomacro**
gomacro 是一個近乎完整的 Go 解釋器,用純 Go 實現,它同時提供交互式 REPL 和腳本模式,並且在運行時不需要 Go 工具鏈(除了一些非常特殊的場景:在運行時導入第三方包)。它在 Go 標準庫之外有兩個依賴項:github.com/peterh/liner 和 golang.org/x/tools/go/packages。REPL 是 Read-Eval-Print Loop 的縮寫 ⌘ [Read more](https://www.readfog.com/a/1670225587037376512) 2022-05-31T11:44:54Z **Go 中的 HTTP debug 技能 瞭解一下**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。 歡迎大家加入 Go 招聘交流羣,來這裏找志同道合的小夥伴!跟土撥鼠們一起交流學習。最近小土把一個負責的 HTTP 服務搬上了公司的內部的 k8s 平臺。由於部分 HTTP 服務還未接入 k8s 平臺,所以內部服務之間的交互主要通過內網域名。說到這裏,一天下午小土負責的 A 服務跟下游服務 B ⌘ [Read more](https://www.readfog.com/a/1670351493453156352) 2022-05-31T11:48:54Z **2022 年值得學習的 Golang 包**
大家好,我是程序員幽鬼。今天爲大家推薦 2022 年最好的 Go 包。Fyne----Fyne 是一個很棒的 GUI 框架,你可以在 Golang 中使用,如果你是使用 Golang 的軟件開發人員,建議看看這個包!之前發過一篇 Go GUI 的開發者調查結果文章:Go GUI 開發者調查結果。Fyne 倉庫地址:https://github.com/fyne-io/fyne。Gopher Dat ⌘ [Read more](https://www.readfog.com/a/1670351745065259008) 2022-05-31T11:59:13Z **Go 實現 PostgreSQL 前後端協議**
1 PG 前後端協議----------本文基於 3.0 版本協議,主要以圖示方式更爲形象的描述其中比較重要的鏈接、查詢等協議,詳盡的文字說明可參考官方文檔《Chapter 53. Frontend/Backend Protocol》(https://www.postgresql.org/docs/current/protocol.html) 或中文文檔《第 53 章 前端 / 後端協議》(htt ⌘ [Read more](https://www.readfog.com/a/1670352393913602048) 2022-05-31T12:04:27Z **Golang 實現健壯的內存型緩存**
本文介紹了緩存的常見使用場景、選型以及注意點,比較有價值。內存型緩存是一種以消費內存爲代價換取應用性能和彈性的方式,同時也推遲了數據的一致性。在使用內存型緩存時需要注意並行更新、錯誤緩存、故障轉移、後臺更新、過期抖動,以及緩存預熱和轉換等問題。由來--緩存是提升性能的最便捷的方式,但緩存不是萬能的,在某些場景下,由於事務或一致性的限制,你無法重複使用某個任務的結果。緩存失效是計算機科學中最常見的兩 ⌘ [Read more](https://www.readfog.com/a/1670352723505156096) 2022-05-31T12:02:20Z **Go 的併發沒有它,就像 iphone 沒有網絡一樣**
簡介    Golang 的併發屬性是該語言的一個大殺器,說到併發就不能不提Channel, 你可以把它看成一個管道,通過它併發核心單元就可以發送或者接收數據進行通訊。這篇文章來深入瞭解一下 channel。 channel 的設計是基於 CSP 模型的。CSP 是 Communicating Sequential Process 的簡稱,中文可以叫做通信順序進程,是一種併發編程模型,由 Ton ⌘ [Read more](https://www.readfog.com/a/1670352589996265472) 2022-05-31T12:06:02Z **從 Go log 庫到 Zap,怎麼打造出好用又實用的 Logger**
日誌無論對於程序還是程序員都非常重要,有多重要呢,想要長期在公司健健康康的幹下去就得學會階段性划水,階段性划水的一大關鍵的就是幹活快過預期但是裝作。。。不對,這個開頭不對勁,下面重來。日誌無論對於程序還是程序員都非常重要,程序員解決問題的快慢除了經驗外,就是看日誌能不能有效地記錄問題發生的現場以及上下文等等。那麼讓讓程序記錄有效的日誌,除了程序內記日誌的點位儘量精準外,還需要有一個稱手的 Logg ⌘ [Read more](https://www.readfog.com/a/1670352823264579584) 2022-06-01T02:34:36Z **Go: WebSockets 單元測試**
WebSockets 通過 TCP 連接提供客戶端與服務器之間的雙向即時通信。這意味着,我們可以維護一個 TCP 連接,然後發送和監聽該連接上的消息,而不是不斷地通過新建 TCP 連接去輪詢 web 服務器的更新。在 Go 的生態中,WebSocket 協議有幾個不同的實現。有些庫是協議的純實現。另外一些則選擇在 WebSocket 協議的基礎上構建,爲他們特定的用例創建更好的抽象。 下面是一個 ⌘ [Read more](https://www.readfog.com/a/1670407469063573504) 2022-06-01T02:45:00Z **我做 Go 項目的一些實戰經驗**
由於 Golang 不像 Java 一樣有一個統一的編碼模式,所以我們和其他團隊一樣,採用了《Go 面向包的設計和架構分層 [1]》這篇文章介紹的一些理論,然後再結合以往的項目經驗來進行分包:├── cmd/│   └── main.go //啓動函數├── etc│   └── devconf.yaml              // 配置文件├── global│   └── global.g ⌘ [Read more](https://www.readfog.com/a/1670408123268042752) 2022-06-02T04:43:04Z **Go Error 處理最佳實踐**
作者:faberli,騰訊 IEG 後臺開發工程師 錯誤處理一直以一是編程必需要面對的問題,錯誤處理如果做的好的話,代碼的穩定性會很好。不同的語言有不同的出現處理的方式。Go 語言也一樣,在本篇文章中,我們來討論一下 Go 語言的錯誤處理方式。一、Error vs Exception1.1 Error 錯誤是程序中可能出現的問題,比如連接數據庫失敗,連接網絡失敗等,在程序設計中,錯誤處理是業務 ⌘ [Read more](https://www.readfog.com/a/1670506148107751424) 2022-06-02T04:48:02Z **一篇文章帶你瞭解 Go 語言基礎之接口(下篇)**
前言--Hey,大家好呀,我是碼農, 星期八,上次咱們說的接口呀,還是沒說完,還剩下了一些,一篇文章帶你瞭解 Go 語言基礎之接口(上篇),下面就來看看叭!!空接口含義-----本篇介紹的就是存儲類接口,存儲接是我的命名,其實人家就叫空接口。空接口的作用就是可以存儲任何數據。同理,空接口沒有定義任何方法,也就是說任何接口都實現了空接口,所以空接口才能存任意數據。空接口---空接口示例代碼packa ⌘ [Read more](https://www.readfog.com/a/1670506460077985792) 2022-06-02T13:11:49Z **深入 Golang channel 基礎用法都在這了!**
前言 --------你好哇!本文是「Golang 併發編程」系列的第 2 篇文章~現在感覺這個坑開得有點大,沒個一年半載的講不清楚了……上篇文章我們學習了 Go 語言中的 Goroutine 創建和調度的機制,理解了一條簡單的 go 命令背後的原理。本文開始,將深入研究 go 語言中的 channel,將拆分爲基礎用法、實用場景、反面教材、源碼實現四篇文章來介紹,歡迎關注追更~本文將介紹 ch ⌘ [Read more](https://www.readfog.com/a/1670538155452895232) 2022-06-02T13:24:31Z **讓我們使用 Go 實現基本的服務發現**
我們已經知道,要請求一個服務實例(服務器),我們必須知道它的網絡位置(IP 地址和端口)。隨着當今世界微服務的突破,越來越多的用戶、請求和需求使得這項工作變得非常困難。在基於雲的微服務時代,我們的服務會因爲自動伸縮、故障、升級等各種不同的情況而不斷變化。由於這些變化,他們不斷獲得新的 IP。這就是服務發現進入微服務場景的地方。我們需要一些系統來隨時關注所有服務,並隨時跟蹤哪個服務部署在哪個 IP ⌘ [Read more](https://www.readfog.com/a/1670538954896674816) 2022-06-06T02:04:31Z **某些情況下,合理使用指針將大大提升程序的運行效率**
1\. 避免在循環中造成不必要的數組空指針檢查--------------------------目前官方標準 Go 編譯器實現中存在一些缺陷(v1.18)。其中之一是 一些 nil 數組指針檢查沒有被移出循環。這裏有一個例子來體現這個缺陷。// unnecessary-checks.gopackage pointersimport "testing"const N = 1000var a [N]i ⌘ [Read more](https://www.readfog.com/a/1670858561005129728) 2022-06-06T03:41:32Z **Go 語言怎麼使用對稱加密?**
大家好,我是 frank。 歡迎大家關注「Golang 語言開發棧」公衆號。 01 介紹在項目開發中,我們經常會遇到需要使用對稱密鑰加密的場景,比如客戶端調用接口時,參數包含手機號、身份證號或銀行卡號等。對稱密鑰加密是一種加密方式,其中只有一個密鑰用於加密和解密數據。通過對稱加密進行通信的實體必須共享該密鑰,以便可以在解密過程中使用它。這種加密方法與非對稱加密不同,非對稱加密使用一對密 ⌘ [Read more](https://www.readfog.com/a/1670864664353935360) 2022-06-06T03:40:48Z **使用 BPF- 將 Go 網絡程序的吞吐提升 8 倍**
經典的 bpf(classical Berkeley Packet Filter) 是非常好用的一個技術,在一些特殊的 Go 底層網絡編程的場合,可以很好的提高性能。背景--先前我開發過一個 Go UDP 應用程序, 客戶端和服務端通過 UDP 程序,通過 raw socket 進行通訊。程序的目的比較特殊,這裏我以一個簡單的程序爲例介紹。事實上,我說我使用 rawsocket 方式並不嚴謹,我並 ⌘ [Read more](https://www.readfog.com/a/1670864618803793920) 2022-06-06T03:40:06Z **簡化 Go 中對 JSON 的處理**
我的第一個 Go 工程需要處理一堆 JSON 測試固件並把 JSON 數據作爲參數傳給我們搭建的 API 處理。另一個團隊爲了給 API 提供語言無關的、可預期的輸入和輸出,創建了這些測試固件。在強類型語言中,JSON 通常很難處理 —— JSON 類型有字符串、數字、字典和數組。如果你使用的語言是 javascript、python、ruby 或 PHP,那麼 JSON 有一個很大的好處就是在解 ⌘ [Read more](https://www.readfog.com/a/1670864574741581824) 2022-06-06T07:18:24Z **這一次 ElasticSearch 可能感受到了來自東方的壓力 GoFoun**
什麼是 GoFound?----------------GoFound 一個 golang 實現的全文檢索引擎,支持持久化和單機億級數據毫秒級查找,接口可以通過 http 調用。爲什麼要用 GoFound?------------------一個小巧精悍的全文檢索引擎,支持持久化和單機億級數據毫秒級查找。ElasticSearch 缺點就是配置繁瑣、基於 JVM 對內存消耗比較大。gofound ⌘ [Read more](https://www.readfog.com/a/1670878309093838848) 2022-06-06T07:17:06Z **Golang 事件系統 Event Bus**
最近在學習開源項目Grafana的代碼,發現作者實現了一個事件總線的機制,在項目裏面大量應用,效果也非常好,代碼也比較簡單,介紹給大家看看。 源碼文件地址:grafana/bus.go at main · grafana/grafana · GitHub註冊和調用--------在這個項目裏面隨處可見這種寫法:func ValidateOrgAlert(c models.ReqContext) ⌘ [Read more](https://www.readfog.com/a/1670878227096244224) 2022-06-06T09:46:51Z **你該刷新 gomonkey 的慣用法了**
曉龍老師來自中興通訊,敏捷技術教練,2020 年和 2021 年公司十佳教練,Go 語言知名打樁框架 gomonkey 作者,具有十多年軟件架構和開發經驗。近年來專注於 PaaS 和 5G 等大型平臺軟件的設計與開發,尤其對於 TDD、 DDD 和微服務具有深刻的理解,對於大型軟件的重構具有豐富的實戰經驗。曾經作爲演講嘉賓多次參加全球架構師峯會、全球 C++ 及系統軟件技術大會、領域驅動設計中 ⌘ [Read more](https://www.readfog.com/a/1670887648526438400) 2022-06-06T09:43:09Z **爲什麼 go 中的 receiver name 不推薦使用 this 或者 self**
前言 在日常的開發中我們除了定義函數以外, 我們還會定義一些方法。這本來沒有什麼, 但是一些從 PHP 或者其他面嚮對象語言轉 GO 的同學往往會把 receiver name 命名爲this, self, me等。筆者在實際項目開發中也遇到類似的同學, 屢次提醒卻沒有效果,於是決心寫下這篇文章以便好好說服這些同學。CR 標準做法-------首先我們來看一下 GO 推薦的標準命名Receive ⌘ [Read more](https://www.readfog.com/a/1670887415088254976) 2022-06-06T10:38:00Z **Gopher 應該記住這 10 個命令**
大家好,我是程序員幽鬼。Go 最近真的起飛了。越來越多的公司採用它,開發人員也普遍接受它,因爲它易於學習,功能強大。如果你目前正在學習 Go 語言,這裏有 10 個有用的 CLI 命令,你可能會在每天使用 Golang 時使用它們。你在本地機器上使用 Go 進行任何操作之前,你需要安裝 Go 編譯器,然後可以通過運行以下命令檢查是否正確安裝(能正常輸出版本信息,表明安裝成功了):$ go vers ⌘ [Read more](https://www.readfog.com/a/1670890866324115456) 2022-06-08T12:02:29Z **如何用 Go 寫出優美的代碼 - Go 的設計模式【單例模式,工廠方法模式】篇一**
大家好,我是追麾 (hui)。 接下來的幾周時間給大家分享一系列 Go 設計模式文章,設計模式在我們的面試中也會被經常問到,像 Java 語言會用到設計模式,對於 Go 語言,設計模式使用會比較弱點,所以這裏給大家一起來學習分享 Go 的設計模式,讓我們在開發中也大量應用到設計模式,幫助我們的 Go 代碼更加優美,可讀性更好。第一篇主要分享兩種模式,單例模式和工廠方法模式。Go 的單例模式--- ⌘ [Read more](https://www.readfog.com/a/1671077375315644416) 2022-06-08T12:08:59Z **如何用 Go 寫出優美的代碼 - Go 的設計模式【簡單工廠模式,抽象工廠模式】篇二**
大家好,我是追麾 (hui)。上一次分析完 Go 的設計模式第一篇,有同學後臺問一些設計原則的問題,這篇我們就來講一下設計的一些原則,然後再繼續設計模式的學習。下圖是本文提綱。關於程序設計有六大原則,具體原則如下,當然這個不是 Go 語言獨有的,而是所有的語言都有的。瞭解了每個程序設計原則的目的,並且運用到我們的程序中去,會讓我們的代碼可讀性高,更加優美,你也會更加愛上寫代碼。單一職責原則---- ⌘ [Read more](https://www.readfog.com/a/1671077784681811968) 2022-06-08T12:31:13Z **碼住!Golang 併發安全與引用傳遞總結**
因爲現在服務上雲的趨勢,業務代碼都紛紛轉向 golang 的技術棧。在遷移或使用的過程中,由於對 golang 特性的生疏經常會遇到一些問題,本文總結了 golang 併發安全和參數引用傳值時的一些知識。一、Map 類型併發讀寫引發 Fatal Error先看一個在 Go 中關於 Map 類型併發讀寫的經典例子:var testMap = map[string]string{}func main ⌘ [Read more](https://www.readfog.com/a/1671079183384678400) 2022-06-09T01:37:22Z **用 Go 重寫 Node-js 服務,性能提升 5 倍,內存減少 40-**
文 \| 白開水 出品 \| OSC 開源社區(ID:oschina2013)Hasura Storage 是一項開源服務,在 hasura 和任何 s3 兼容的存儲服務之上增加了一個存儲服務。其目的是能夠利用雲存儲服務,同時也利用 hasura 的功能,如它的 graphql API、權限、行動、預設等。 出於業務發展需求,Hasura Storage 團隊近期將其原本用 Node.js 編寫的 ⌘ [Read more](https://www.readfog.com/a/1671128643411218432) 2022-06-09T01:39:56Z **啓動一個 goroutine 但不知道何時停止它**
啓動一個 goroutine 是件簡單也是件很廉價(佔用內存小)的事,以至於我們不太關注何時停止一個 goroutine,這可能會導致內存泄露問題。不清楚什麼時候停止一個 goroutine 是一個設計問題,也是 Go 開發中常見的併發類錯誤問題。下面開始分析爲什麼要關注它以及如何防止產生。首先讓我們對一個 goroutine 泄露產生的影響有一個量的概念。在內存佔用方面,goroutine 以最 ⌘ [Read more](https://www.readfog.com/a/1671128805047111680) 2022-06-09T01:39:02Z **Go: 監測文件修改**
在開發過程中,經常需要觀察本地文件系統的更改。經過幾個小時的搜索後,找到了一個簡單的工具來做這件事。該工具就是 fsnotify[https://github.com/fsnotify/fsnotify] 是一個 Go 跨平臺文件系統通知工具。它提供了一個簡單的接口來監測本地文件系統中的更改。本文我們就來看看如何使用這個工具。安裝工具$ go get github.com/fsnotify/fsn ⌘ [Read more](https://www.readfog.com/a/1671128748748017664) 2022-06-09T14:54:38Z **對 tcpdump 不熟的可以試試用這個 Go 官方庫排查網絡問題**
最近把一個負責的 HTTP 服務搬上了公司的內部的 k8s 平臺。由於部分 HTTP 服務還未接入 k8s 平臺,所以內部服務之間的交互主要通過內網域名。說到這裏,一天下午小土負責的 A 服務跟下游服務 B 的請求一直報警超時,開始小土使用 tcpdump 定時抓包系統採集了一些 pcap 文件,由於小土對抓包也不是很在行,HTTP 抓包也碰了一鼻子灰。在跟同事交流的同時,想到了 httptrac ⌘ [Read more](https://www.readfog.com/a/1671178803043471360) 2022-06-09T15:03:03Z **面試官:講下 Go 語言中 slice 的原理和坑**
Slice 原理--------Slice 數據結構和原理1、相對於數組,Slice 的長度是動態可變的。如下:func CreatSlice() { s := make([]int, len(), cap()) var s1 []int}func CreatArr() { var a [length]int}可以很清楚的看到,數組的長度是在編譯時靜態計算的,並且數組無法在運行時動態擴縮容量的。2 ⌘ [Read more](https://www.readfog.com/a/1671179333191962624) 2022-06-10T03:56:39Z **Go 範型下,優雅的 Lodash 風**
推薦理由--------go 語言比較崇尚簡單,所以在內嵌包中沒有提供過多幫助性的函數,尤其在範型出來前想要寫一個簡單的對 slice 和 map 間互相轉化的方法可能就需要很多行代碼,並且這樣並不是很優雅。如今,go 範型已經得到官方的正式發佈,samber/lo 又提供了優雅的 lodash 風格的工具函數,正是代碼重構的好時機。常見的使用場景----------- 這裏只是用 slice ⌘ [Read more](https://www.readfog.com/a/1671228003771846656) 2022-06-10T04:04:23Z **手撕 Golang 高性能內存緩存庫 bigcache**
前言-----你好哇!我是小翔。之前寫了三篇 #Golang 併發編程 的文章了,這次來換換口味,開個 手撕源碼 的新坑!一起來扒一扒 Go 語言高性能 local cache 庫 bigcache,看看能不能把開源大佬們的騷操作帶到項目裏去裝一裝(?)爲什麼要學習開源項目-------------個人認爲學習開源項目的收益:跟進社區,不做井底之蛙 看到一個開源項目,可以思考下:大佬們最近都在解決 ⌘ [Read more](https://www.readfog.com/a/1671228489556135936) 2022-06-10T11:12:37Z **對已經關閉的 channel 進行讀寫操作會發生什麼?**
「面試企業」 深信服 「題目解析」 GOLANG ROADMAP 社區答案 1:(溪尾)---------1 . 讀已關閉的 channel讀已經關閉的 channel 無影響。如果在關閉前,通道內部有元素,會正確讀到元素的值;如果關閉前通道無元素,則會讀取到通道內元素類型對應的零值。若遍歷通道,如果通道未關閉,讀完元素後,會報死鎖的錯誤。 fatal error: all gorou ⌘ [Read more](https://www.readfog.com/a/1671255432394543104) 2022-06-13T06:25:14Z **Go 網絡庫 Gnet 解析**
圖片拍攝於 2022 年 6 月 5 日 杭州  勇士總冠軍!!!距離上次寫文章過了一月有餘,這段時間着實太躺了。以至於昨晚做了一個噩夢,醒來的時候狠狠的抽了自己兩巴掌,不能這麼躺了。上面當然是個笑話。開篇上一篇 Go netpoll 大解析我們分析了 Go 原生網絡模型以及部分源碼,絕大部分場景下 (99%),使用原生 netpoll 已經足夠了。但是在一些海量併發連接下,原生 netpoll ⌘ [Read more](https://www.readfog.com/a/1671509142970404864) 2022-06-13T11:51:44Z **Java、Go 和 Python 的多線程性能對比**
大家好,我是程序員幽鬼。今天分享多線程下這三門語言的表現。簡介--在計算機中,線程是可以由處理器獨立執行的小指令序列。多線程在一個進程中是可能的,其中它們共享資源,例如指令和上下文。發現在運行多線程進程時效率最高的編程語言非常重要,因爲它可以幫助軟件開發人員同時選擇最有利的語言來實現他們的系統。本文的目的是分析和比較 Java、Go 和 Python 使用它們的並行工具解決幾種算法的性能,例如:J ⌘ [Read more](https://www.readfog.com/a/1671529683928322048) 2022-06-13T11:58:04Z **Go: 在使用select-channel時期望確定性的結果**
對 select 在多個通道中的行爲做出錯誤的假設是 Go 開發人員常犯的的一個錯誤,這種錯誤的假設可能會導致難以識別和重現的細微錯誤。假設我們想要實現一個需要從兩個通道接收信息的 goroutine,兩個通道的作用如下:messageCh 通道用於處理接收的消息 disconnectedCh 通道用於接收斷開連接通知,當收到這種斷開信號時,希望從函數返回 在這兩個通道中,希望 mes ⌘ [Read more](https://www.readfog.com/a/1671530082384056320) 2022-06-13T12:12:47Z **Go 語言怎麼優化重複的 if err -- nil 樣板代碼?**
01 介紹Go 語言的錯誤處理在社區中一直被部分 Go 開發者詬病,其中重複的 if err != nil 樣板代碼是最令 Go 開發者難以忍受的,嚴重降低代碼的可讀性。針對這個社區爭論非常激烈的話題,筆者介紹兩種優化重複的 if err != nil 樣板代碼的方式。02 封裝錯誤檢查函數錯誤檢查函數示例代碼:func CheckErrors (err error) {    if err != ⌘ [Read more](https://www.readfog.com/a/1671531008196972544) 2022-06-14T03:18:34Z **Go: 不要使用普通的通道發送通知**
通道 (channel) 是一種通過信號在 goroutine 之間進行通信的機制。信號可以有數據也可以沒有數據,但是對於 Go 開發者來說,處理沒有數據的情況並不是那麼簡單。下面通過一個具體的例子來深入研究它,在程序中,會創建一個通道,該通道將在發生特定斷開連接時發生通知,一種處理的思路是定義一個 chan bool 類型的通道。disconnectCh := make(chan bool)現在 ⌘ [Read more](https://www.readfog.com/a/1671587995378094080) 2022-06-14T11:58:14Z **提升 Go 編碼效率,拒絕加班,真香**
在 Go 語言中,slice、map 都是我們常用的基礎類型,通過它們,我們可以很容易的使用數據。但是你有沒有發現,爲了對這兩種數據進行處理,你不得不編寫很多工具函數?比如,從 slice 切片中查找一個元素的位置?這種查找又分爲從前查找、從後查找。又比如,獲取 map 的所有 keys?或者所有的 value?再比如,JS 語言數組的 map、reduce、filter 函數,這在編程中非常好用 ⌘ [Read more](https://www.readfog.com/a/1671620690265083904) 2022-06-14T12:04:32Z **深入理解 bufio-Scanner**
【導讀】本文介紹了 go 語言 bufio Scanner。Go 自帶的軟件包,提供了緩衝 I/O 技術,用以優化讀取或寫入操作。對於寫入來說,它在臨時存儲數據之前進行的(如磁盤或套接字)。數據被存儲直到達到特定大小。通過這種方式觸發的寫操作更少,每個操作都爲系統調用,操作會很昂貴。對於讀取而言,這意味着在單次操作中檢索更多數據。它還減少了 sycall(系統調用)的數量,但還可以使用更高效的方式 ⌘ [Read more](https://www.readfog.com/a/1671621085876031488) 2022-06-16T14:19:46Z **發現了國外不加班的祕訣,各種 Go 代碼示例都能在這搜到**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。 歡迎大家加入 Go 招聘交流羣,來這裏找志同道合的小夥伴!跟土撥鼠們一起交流學習。前言--之前小土分享過一篇尋找 Go 庫的文章,尋找 Go 庫的網站你知道幾個。從投票數據來看,大家還是喜歡從 Github 進行直接搜索,畢竟庫的祖宗在那裏,小土提供的這幾個網站 https://golangr ⌘ [Read more](https://www.readfog.com/a/1671810788023701504) 2022-06-16T14:32:55Z **你所知道的 string 和 []byte 轉換方法可能是錯的**
前幾天閒聊的時候,景埕 1] 說網上很多 string 和 []byte 的轉換都是有問題的,當時並沒有在意,轉過身沒幾天我偶然看到[字節跳動的一篇文章,其中提到了他們是如何優化 string 和 []byte 轉換的,我便問景埕有沒有問題,討論過程中學到了很多,於是便有了這篇總結。讓我們看看問題代碼,類似的 string 和 []byte 轉換代碼在網上非常常見:func StringToSli ⌘ [Read more](https://www.readfog.com/a/1671811616237260800) 2022-06-20T03:31:48Z **Golang 搭配 makefile 真香!**
這篇文章打算跟大家聊聊 Makefiles,作爲一個後端開發者,熟練掌握 Makefiles 咖啡可以多喝幾口。書歸正傳golang 內置了很多 go commands 可以幫助我們完成 go 每個階段的開發工作,但是很多時候我們需要分享我們的代碼給其他人,初次看到我們代碼工程的人可能並不知道怎麼讓它跑起來。當然你也可以通過README.md或者其他方式來告知讀者。但對於那些只想快速構建程序的人來 ⌘ [Read more](https://www.readfog.com/a/1672132410201968640) 2022-06-20T12:26:35Z **Go 併發最佳實踐**
1、使用 goroutines 管理服務狀態通常啓動一個 http 服務器或其他需要長期在後臺運行的任務時,可以使用 chan 或帶 chan 字段的結構體,實現 goroutines 的同步:type Server strung { quit chan bool }func NewServer() Server{ s := &Server{make(chan bool)} go s. ⌘ [Read more](https://www.readfog.com/a/1672166055301189632) 2022-06-20T12:40:00Z **Go:簡單的優化筆記**
本文整理譯自 Golang: simple optimization notes:https://medium.com/scum-gazeta/golang-simple-optimization-notes-70bc64673980在雲計算時代,我們經常創建 Serverless 應用(一種雲原生開發模式,允許開發人員構建和運行應用程序,而無需管理服務器)。當我們的項目採用這種模式,那基礎設施維 ⌘ [Read more](https://www.readfog.com/a/1672166899506581504) 2022-06-21T15:27:52Z **連 1-0 版本都沒有,Uber 爲什麼會採用這樣一項新技術?**
作者 \| Motiejus Jakštys譯者 \| 平川策劃 \| 羅燕珊 本文最初發佈於 Motiejus Jakštys 的個人博客。 免責聲明:我在 Uber 工作,我的一部分職責是將 zig cc 引入公司。但這篇文章是我的觀點,與 Uber 無關。 我日前在 Zig 的一場交流會上作了題爲 “Uber 引入 Zig” 的 演講。本文從技術和社交兩方面簡單介紹了“Ube ⌘ [Read more](https://www.readfog.com/a/1672268057607770112) 2022-06-21T15:27:21Z **Go Web 框架 echo 路由分析**
【導讀】本文介紹了 echo 框架的路由。在分析之前,帶着問題去查找答案。官方 http 包已經提供了 server 的功能,爲什麼要用框架? 路由註冊----簡單的程序我們來看看 echo 的三種匹配模式和優先級順序匹配,優先級從下到下:Static (固定路徑) 類似於/users/new Param (參數路徑) 類似於/users/:id Match any (匹配所有) ⌘ [Read more](https://www.readfog.com/a/1672268025239277568) 2022-06-22T13:13:34Z **深入理解 Golang 併發工具 - Singleflight**
前言--前段時間在一個項目裏使用到了分佈式鎖進行共享資源的訪問限制,後來瞭解到 Golang 裏還能夠使用 singleflight 對共享資源的訪問做限制,於是利用空餘時間瞭解,將知識沉澱下來, 並做分享文章儘量用通俗的語言表達自己的理解,從入門 demo 開始,結合源碼分析 singleflight 的重點方法,最後分享 singleflight 的實際使用方式與需要注意的 “坑 “。另外需注 ⌘ [Read more](https://www.readfog.com/a/1672350205688778752) 2022-06-22T13:34:02Z **深入瞭解 Go ELF 信息**
大家好,我是張晉濤。我們用 Go 構建的二進制文件中默認包含了很多有用的信息。例如,可以獲取構建用的 Go 版本:(這裏我使用我一直參與的一個開源項目 KIND[1] 爲例)➜  kind git:(master) ✗ go version ./bin/kind ./bin/kind: go1.16或者也可以獲取該二進制所依賴的模塊信息:➜  kind git:(master) ✗ go vers ⌘ [Read more](https://www.readfog.com/a/1672351493069574144) 2022-06-22T14:10:57Z **如何獲取 Go 服務依賴包**
在服務治理中,我們有時需要統計業務方服務的依賴包版本號使用情況,以便進行升級和版本兼容,通過 Go 官方提供的 debug.ReadBuildInfo 可以很方便的實現。debug.ReadBuildInfoReadBuildInfo 是 Go 標準庫提供的方法,通過該方法可以讀取打包程序的構建信息,裏面就包括我們想要的依賴包和版本號信息。// ReadBuildInfo returns the ⌘ [Read more](https://www.readfog.com/a/1672353815821651968) 2022-06-22T14:22:58Z **Go: 誤用sync-WaitGroup**
sync.WaitGroup 是一種等待 n 個操作完成的機制,通常,我們使用它來等待 n 個 goroutine 完成。下面將學習它的使用方法,然後將看到一個高頻錯誤使用問題,以及這個問題導致的不確定性行爲。下面的代碼創建了一個 sync.WaitGroup 對象,並且爲默認的零值。wg := sync.WaitGroup{}在內部實現上,sync.WaitGroup 擁有一個默認初始化零的內部 ⌘ [Read more](https://www.readfog.com/a/1672354571332194304) 2022-06-22T14:24:50Z **Go 如何調用一個只支持 batch_call 的服務?**
我們先來說下標題是什麼意思。爲了更好的理解我說的是啥,我們來舉個例子。假設你現在在做一個類似 B 站的系統,裏面放了各種視頻。用戶每天在裏頭上傳各種視頻。按理說每個視頻都要去審查一下有沒有搞顏色,但總不能人眼挨個看吧。畢竟唐老哥表示這玩意看多了,看太陽都是綠色的,所以會有專門訓練過的算法服務去做檢測。但也不能上來就整個視頻每一幀都拿去做審查吧,所以會在每個視頻里根據時長和視頻類型隨機抽出好幾張圖片 ⌘ [Read more](https://www.readfog.com/a/1672354688663654400) 2022-06-23T02:48:40Z **Go 語言三個高效編程的技巧**
Go 是一種非常不錯的編程語言。它是一種讓你真正的關注自己的業務,不必爲程序本身操心太多的語言,因此您可以儘快編寫應用程序。比如它有比較完整的生態系統,可爲你提供入門所需的一切。但是呢,它也不是萬能的,有一些需要我們注意。我寫這篇文章主要是爲了提醒我自己,也是一些觀察和總結。當然,這些只是技巧,並不是真正的問題,當然如果你注意到它們並且在實戰中使用,那麼將會讓你非常受益,這是新手和老手的差別。不要 ⌘ [Read more](https://www.readfog.com/a/1672401486428082176) 2022-06-23T02:48:12Z **Go 語言使用 MySQL 的常見故障分析和應對方法**
導讀:很多同學在使用 Go 和數據庫打交道的過程中,經常會遇到一些異常不知道爲什麼,本文從 SQL 連接池的原理進行分析,模擬了一些例子對異常的現象進行解讀分析,並給出一些常見的應對手段,期望能幫助到大家。 全文 12795 字,預計閱讀時間 32 分鐘有很多同學遇到了 MySQL 查詢緩慢的問題,其可能表現爲 SQL 語句很簡單,但是查詢耗時很長。可能是由於這樣一些原因所致。1、資源未及時釋放 ⌘ [Read more](https://www.readfog.com/a/1672401458033692672) 2022-06-23T06:47:05Z **Golang 可重入鎖的實現**
項目中遇到了可重入鎖的需求和實現,具體記錄下。爲什麼需要可重入鎖---------我們平時說的分佈式鎖,一般指的是在不同服務器上的多個線程中,只有一個線程能搶到一個鎖,從而執行一個任務。而我們使用鎖就是保證一個任務只能由一個線程來完成。所以我們一般是使用這樣的三段式邏輯:Lock();DoJob();Unlock();但是由於我們的系統都是分佈式的,這個鎖一般不會只放在某個進程中,我們會借用第 ⌘ [Read more](https://www.readfog.com/a/1672416487214780416) 2022-06-23T13:57:00Z **Go 錯誤處理新思路?用左側函數和表達式**
大家好,我是煎魚。錯誤處理一直是 Go 一個很有爭議的地方,大家在該類提案上貢獻了各種各樣的想法。在五一假期期間,我也發現了一個有趣的技術提案,那就是:左側函數;還有 Go+ 的新思路。今天就由煎魚帶大家一起來看看。Go 新提案:左側函數-----------在現有 Go1 的錯誤處理機制下,我們一般處理錯誤都需要寫大量的 if err != nil 的邏輯。有人笑稱 100 行裏有 50 行是以 ⌘ [Read more](https://www.readfog.com/a/1672443535081705472) 2022-06-23T13:55:44Z **等等, 怎麼使用 SetMemoryLimit?**
Go 1.19 中終於實現了SetMemoryLimit的功能。Go 的 GC 並不像 Java 那樣提供了很多的參數可以調整,目前也就有GOGC這麼一個參數,所以能增加一個可以調整 GC 的參數確實讓人興奮。一直關注 Go 性能同學一定知道,最近幾年有兩個調整 Go GC 的 hack 方式:ballast[1]: 壓艙石技術。使用一個 "虛假" 的內存佔用,讓 Go 運行時難以達到觸發 GC ⌘ [Read more](https://www.readfog.com/a/1672443455276683264) 2022-06-23T13:55:12Z **你真正的瞭解 hystrix-go 嘛**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。 歡迎大家加入 Go 招聘交流羣,來這裏找志同道合的小夥伴!跟土撥鼠們一起交流學習。Hystrix[1] 是 Netflix 的一個非常棒的項目。 Hystrix 是一個延遲和容錯庫,旨在隔離對遠程系統、服務和第三方庫的訪問點,防止級聯故障,並在故障不可避免的複雜分佈式系統中實現彈性。我認爲程 ⌘ [Read more](https://www.readfog.com/a/1672443421508341760) 2022-06-24T11:47:00Z **構建 Go 命令行程序工具鏈**
偷懶的故事今天的推薦需要從一個偷懶的故事說起 ···話說不久前,需要輸出一個按發佈時間排序的酷 Go 推薦的歷史文章列表,類似於這樣:於是乎,想着從 GoCN 上一篇一篇 copy 文章的標題吧,5 篇下來,手眼已經不協調了,此時此刻纔想起自己貌似是個碼農,此情此景那必須 coding 一段,讓代碼來輸出這個列表。思路很簡單,看一下 GoCN 文章列表的 API,再看下鑑權方式(看 header ⌘ [Read more](https://www.readfog.com/a/1672525953124896768) 2022-06-27T03:48:37Z **簡單好用的緩存庫 gcache**
前言-----開發時,如果你需要對數據進行臨時緩存,按照一定的淘汰策略,那麼 gcache 你一定不要錯過。gcache golang 的緩存庫。它支持可擴展的 Cache,可以選擇 LFU,LRU、ARC 等淘汰算法。特性-----gcache 有很多特性:-------------支持過期淘汰算法 Cache, 比如 LFU, LRU 和 ARC Goroutine 安全 支持事件 ⌘ [Read more](https://www.readfog.com/a/1672767646402187264) 2022-06-27T03:47:14Z **用 channel 把 Go 程序寫崩的三種姿勢,你集齊過嗎?**
前言-----大家好,我是網管。有時候覺得 Go 語言是給大拿專門設計的語言吧,給普通人尤其剛入門的人不少心智負擔。我說的有時候哈,網管我可不是語言黑,月薪五萬,老闆您甚至可以讓我用 Python 天天給您寫喜歡的總裁日報、週報、月報、季報......。咱們說回 Go ,切片用的時候還得擔心會不會切換底層數組,切片的詭異(僅對剛接觸 Go 的人來說,用多了大家都被坑成專家了)現象,咱們以前聊過。以 ⌘ [Read more](https://www.readfog.com/a/1672767559927173120) 2022-06-27T03:42:34Z **Go channel 的應用場景**
channel 適用於數據在多個協程中流動的場景,有很多實際應用:① 任務定時比如超時處理:select {    case <-time.After(time.Second):定時任務select {    case <- time.Tick(time.Second)② 解耦生產者和消費者可以將生產者和消費者解耦出來,生產者只需要往 channel 發送數據,而消費者只管從 channel 中獲 ⌘ [Read more](https://www.readfog.com/a/1672767266110935040) 2022-06-27T03:53:54Z **面試官:Context 攜帶數據是線程安全的嗎?**
前言\-\- 最近一個羣裏看到一個有趣的八股文,問題是:使用context攜帶的value是線程安全的嗎?這道題其實就是考察面試者對context實現原理的理解,如果不知道context的實現原理,很容易答錯這道題,所以本文我們就藉着這道題,再重新理解一遍context攜帶value的實現原理。context攜帶value是線程安全的嗎?--------------------------先說答案, ⌘ [Read more](https://www.readfog.com/a/1672767978924511232) 2022-06-27T03:53:09Z **GoBGP 中文入門指南**
GoBGP 是使用 Go 語言開發的,運行在 Linux 系統上的開源工具,可以提供 BGP 協議的控制平面功能。與 Quagga/FRRouting 相比,GoBGP 的性能更好,收斂時間更短,可以適用於更大規模的網絡,比如充當 IXP 路由器。可以使用 Python、C++ 等多種語言,通過 gRPC API 對 GoBGP 進行配置,當然也支持 CLI。GoBGP 還支持 OpenConfi ⌘ [Read more](https://www.readfog.com/a/1672767932149633024) 2022-06-27T10:35:14Z **調試利器 go-spew**
對於應用的調試,我們經常會使用 fmt.Println 來輸出關鍵變量的數據。或者使用 log 庫,將數據以 log 的形式輸出。對於基礎數據類型,上面兩種方法都可以比較方便地滿足需求。對於一些結構體類型數據,通常我們可以先將其序列化後再輸出。如果結構體中包含不可序列化的字段,比如 func 類型,那麼序列化就會拋出錯誤,阻礙調試。go-spew-------上面的需求,go-spew 可以完美地 ⌘ [Read more](https://www.readfog.com/a/1672793229103304704) 2022-06-27T10:39:10Z **從 Go 程序第一行代碼,到在 K8s 上運行,要經歷多少步?**
大家好,我是網管。咱們的 K8s 入門和實踐,在經歷了三篇理論知識的後,相信各位都已經期待許久(可能的吧),就差私信我:“你整着理論整半天有啥用,本大人寫的程序怎麼能放到 K8s 上運行”。別急,今天這篇文章就帶你從寫第一行代碼開始,一步步教你把程序放到 K8s 跑起來。這次咱們先用 Go 做個例子,後面再寫一篇怎麼把 Spring Boot 應用放到 K8s 上運行。本文的重點,不在於那種語言寫 ⌘ [Read more](https://www.readfog.com/a/1672793475925512192) 2022-06-27T10:48:23Z **如何更酷地實現 Go 程序熱開關功能**
開發中,我們經常會有熱開關的需求,即特定功能在程序運行中的適當時候對它進行打開或關閉。例如性能分析中使用的 pprof 採樣,就是一種典型的熱開關。本文將討論如何將這種熱開關做得更酷。在介紹新方案之前,我們回顧一下,在 Go 程序中,pprof 是如何做的。接口調用----對程序進行性能採樣,可能會影響到它的服務能力。因此,線上採樣一般是在指定的小塊時間範圍內進行,需要有效的開關控制。爲了做到這點 ⌘ [Read more](https://www.readfog.com/a/1672794055867731968) 2022-06-27T13:58:04Z **如何接受併發 goroutine 的錯誤**
實現類似 errgroup 的功能 其實比較簡單了,就是在併發 goroutine 的時候,我們根據初始化的 goroutine 的數量初始化一個chan error類型的 chan,然後每個 goroutine 在遇到錯誤時候,將 error 寫入 chan,這樣主 goroutine 通過 for range 去遍歷這個 chan 就行了。代碼package mainimport ( "er ⌘ [Read more](https://www.readfog.com/a/1672805989337894912) 2022-06-28T12:08:15Z **Go: Copying a sync type**
複製 sync 包中類型的變量時需小心謹慎sync 包提供了基本的同步原語,像互斥鎖 (sync.Mutex)、條件變量(sync.Cond)、等待組(sync.WaitGroup) 等。對於所有這些類型,有一條硬性規則需要我們遵守:不能對這些類型的變量進行復制使用。本文討論它們的工作原理以及如果進行復制使用會導致什麼問題。下面程序實現了一個計數存儲功能,並且是線程安全的。Counter結構中的m ⌘ [Read more](https://www.readfog.com/a/1672889677470863360) 2022-06-28T12:06:32Z **Go 字符串編碼?UTF-8?Unicode?看完就通!**
Go byte rune string-------------------string 類型在 golang 中以 utf-8 的編碼形式存在,而 string 的底層存儲結構,劃分到字節即 byte,劃分到字符即 rune。本文將會介紹字符編碼的一些基礎概念,詳細講述三者之間的關係,並提供部分字符串相關的操作實踐。一、基礎概念介紹 Unicode,UTF-8 之間的關係與編碼規則1、Unico ⌘ [Read more](https://www.readfog.com/a/1672889569461243904) 2022-06-28T12:05:37Z **Go 每日一庫:tproxy 是個啥?**
你有同感嗎?------當大家在開發服務端代碼的時候,會不會經常有如下疑問?納悶 MySQL 連接池到底有多少連接? 每個連接的生命週期持續多久? 連接異常斷開的時候到底是服務端主動斷的,還是客戶端主動斷的? 當長時間沒有請求的時候,底層庫是否有 KeepAlive 請求? 複雜網絡情況的處理從來都是後端開發的重點和難點之一,你是不是也爲各種網絡情況的調試而頭頂發涼呢?所以 ⌘ [Read more](https://www.readfog.com/a/1672889512123011072) 2022-06-28T12:03:56Z **Go 的調度器是怎麼實現協程中斷的?遠離手撕源碼,用 GIF 動圖告訴你!**
同志們,如今手撕源碼已經過時了,圖解勉勉強強還可以,有的博主都開始 GIF 圖截、動畫解了,對於一個只會寫字兒的號主,我絲毫不慌(假的),準備遠離手撕源碼、多看點文學書,一定要讓你們感覺到我文字的力量(多給你們寫點段子)。今天轉載一個 Go 調度器的 GIF 圖解,以下是正文。光看標題,大家可能不太理解我說的是啥。 我們平時創建一個協程,跑一段邏輯,代碼大概長這樣。package mainimp ⌘ [Read more](https://www.readfog.com/a/1672889406197960704) 2022-06-29T03:40:20Z **Go 讓消費速度更快**
可複用的生產消費邏輯 有時候我們從接口當中接受一批數據,想要它們在後臺運行,或者說同步執行效率更快;有時候從緩存或者隊列中消費數據,想要增加消費的速度;有時候跑一批數據,想要處理效率更高;那麼遇到這些場景,這一套生產消費模式就足以應對了,來看下代碼。代碼func ConsumeTask(ctx context.Context) {LOOP: var total int var success i ⌘ [Read more](https://www.readfog.com/a/1672948319762092032) 2022-06-30T06:21:51Z **在 Go 中如何正確重試請求?**
導語 \| 我們平時在開發中肯定避不開的一個問題是如何在不可靠的網絡服務中實現可靠的網絡通信,其中 http 請求重試是經常用的技術。但是 Go 標準庫 net/http 實際上是沒有重試這個功能的,所以本篇文章主要講解如何在 Go 中實現請求重試。一、概述要理解 cpo 機制的產生和使用,並不是一件容易的事。說實話,筆者第一次看到這個機制。一般而言,對於網絡通信失敗的處理分爲以下幾步:感知錯誤。通 ⌘ [Read more](https://www.readfog.com/a/1673049077870333952) 2022-06-30T06:19:49Z **繼 Python 之後,Go 也順利在瀏覽器上運行**
來自公衆號:OSC 開源社區 鏈接:https://www.oschina.net/news/194738/goscript-wasmAnaconda 開發商最近發佈了 PyScript,這是一個可以讓開發者在 HTML 中混寫 Python 代碼的框架,有人將其稱爲 “Python 版 JSP”。事實上,PyScript 底層採用了 WebAssembly, 因爲它基於 Pyodide ⌘ [Read more](https://www.readfog.com/a/1673048950469398528) 2022-06-30T06:34:48Z **Go 語言數據競爭檢測與數據競爭模式**
uber,就是那個早早退出中國打車市場的優步,是 Go 語言早期接納者,也是 Go 技術棧的 “重度用戶”。uber 內部的 Go 代碼倉庫有 5000w + 行 Go 代碼 [1],有 2100 個 Go 實現的獨立服務,這樣的 Go 應用規模在世界範圍內估計也是 Top3 了吧。uber 不僅用 Go,還經常輸出它們使用 Go 的經驗與教訓,uber 工程博客 [2] 就是這些高質量 Go 文 ⌘ [Read more](https://www.readfog.com/a/1673049892890710016) 2022-07-01T04:38:20Z **聊聊兩個 Go 即將過時的 GC 優化策略**
這篇文章本來是要講 Go Memory Ballast 以及 Go GC Tuner 來調整 GC 的策略,實現原理怎麼樣,效果如何。但是在寫的過程中,發現 Go 1.19 版本出了,有個新特性讓這兩個優化終究成爲歷史。概述--首先我們來簡單的看一下 Go GC 中做了什麼事,以及它裏面比較耗時的地方是什麼,我們才能對它進行優化。首先對於 GC 來說有這麼幾個階段:1. sweep termina ⌘ [Read more](https://www.readfog.com/a/1673133161863811072) 2022-07-01T06:14:35Z **使用 Go 和 Web 技術構建桌面應用程序**
《開源精選》是我們分享 Github、Gitee 等開源社區中優質項目的欄目,包括技術、學習、實用與各種有趣的內容。本期推薦的是一個使用 Go 和 Web 技術構建桌面應用程序的項目——WAILS。Wails 是一個框架,可以使用 Go 和 Web 技術幫助編寫桌面應用程序。對於前端,使用 Webview 庫. 不過它使用平臺的本機渲染引擎(當前 Linux 和 Mac 使用 Webkit,W ⌘ [Read more](https://www.readfog.com/a/1673139217713172480) 2022-07-01T10:46:21Z **Go 讀寫鎖底層是怎麼實現的**
「答案」(自由)------------讀寫鎖的底層是基於互斥鎖實現的。爲什麼有讀寫鎖,它解決了什麼問題?(使用場景) 它的底層原理是什麼? 在這裏我會結合 Go 中的讀寫鎖 RWMutex 進行介紹。我們通過與 Mutex 對比得出答案。Mutex 是不區分 goroutine 對共享資源的操作行爲的,在讀操作、它會上鎖,在寫操作,它也會上鎖,當一段時間內,讀操作居多時,讀操作在 M ⌘ [Read more](https://www.readfog.com/a/1673156315943374848)