# 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@72e53a9 # 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 # type = rss # source = https://www.readfog.com/t/go/feed # avatar = https://feeds.twtxt.net/yue-fang-readfog-go/avatar.png#vb4wqhdj5rsuracksspo5ewnd47jagkxwt5c4n4hh67ohxqtio5a # description = # updated_at = 2023-03-24T04:08:12Z # 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) 2022-07-04T03:06:33Z **Go 項目實戰—參數綁定,類型轉換**
goshop 開源項目的更新 備註:前面項目中用到的代碼已經分享到 GitHub 中去了,並且以後所有項目中會出現的代碼都會提交上去,歡迎查閱。感興趣的可以點個 star 哦~   https://gitee.com/jobhandsome/goshop/最近在研究微服務框架 go-zero,沒有更新,在這裏說聲抱歉,後面會持續更新新的功能。請繼續關注 今天考慮參數綁定獲取。這裏肯定有些 ⌘ [Read more](https://www.readfog.com/a/1673399179121102848) 2022-07-04T03:18:33Z **Go 面試官:值爲 nil 爲什麼不等於 nil ?**
小明同學去面試被問到了這麼一個面試題,請看代碼:var f func()var a struct{}list := []interface{}{f, a}for , item := range list { if item == nil {  fmt.Println("nil") }}請問輸出結果是啥?可能很多同學,會認爲結果是輸出兩個 nil。爲什麼呢?因爲 f 和 a 都沒初始化,都是 nil ⌘ [Read more](https://www.readfog.com/a/1673399933598797824) 2022-07-04T03:33:04Z **Go 語言怎麼使用變長參數函數?**
01 介紹Go 語言中函數的最後一個參數可以是變長參數,細心的讀者朋友們可能已經發現,在 Go 語言標準庫 fmt包中就有使用變長參數函數,比如 Println 和 Printf。我們在使用 Go 語言開發應用程序時,也可以在合適的場景使用變長參數函數,使我們的代碼更優雅。02 變長參數顧名思義,變長參數是指參數的數量不固定,可以是 0 個,1 個或多個。變長參數的格式是 ...T,在參數的類型前 ⌘ [Read more](https://www.readfog.com/a/1673400846944145408) 2022-07-04T06:27:08Z **Go 如何打包與壓縮文件**
文件的打包、壓縮與解壓縮是經常會使用到的功能,我們可以通過 tar、gzip 等工具來完成這些操作。在 Go 中,標準庫archive與compress爲我們提供了這些能力,通過本文示例,你會發現以 Go 編程的方式生成與處理壓縮打包文件也非常簡單。打包和壓縮-----在開始代碼之前,我們需要明確打包和壓縮的概念。打包,又被稱爲歸檔,指的是一個文件或目錄的集合,而這個集合被存儲在一個文件中。 ⌘ [Read more](https://www.readfog.com/a/1673411798335852544) 2022-07-04T06:31:42Z **Go: time-After導致內存泄露**
time.After 導致內存泄露time.After(time.Duration) 的功能是當持續的時間結束後,會將當前的時間發送到返回的通道中。在某個時間到後執行某個動作可以用 time.After 來實現,它使用起來非常方便,在併發程序中用的比較多。如果我們只是想讓程序睡眠一段時間,可以使用 time.Sleep(time.Duration). time.After 主要用在 “如果在 5 ⌘ [Read more](https://www.readfog.com/a/1673412085292306432) 2022-07-05T03:11:21Z **用 Go 跑的更快:使用 Golang 爲機器學習服務**
因此,我們的要求是用盡可能少的資源完成每秒 300 萬次的預測。值得慶幸的是,這是一種比較簡單的推薦系統模型,即多臂老虎機(MAB)。多臂老虎機通常涉及從 Beta 分佈 等分佈中取樣。這也是花費時間最多的地方。如果我們能同時做盡可能多的採樣,我們就能很好地利用資源。最大限度地提高資源利用率是減少模型所需總體資源的關鍵。 我們目前的預測服務是用 Python 編寫的微服務,它們遵循以下一般結構: ⌘ [Read more](https://www.readfog.com/a/1673490077738700800) 2022-07-06T02:49:39Z **Go 中的 Kubernetes GraphQL 查詢**
搭建 GraphQL 服務器,用於在集羣中搜索 Kubernetes 資源在共享集羣治理中,我們的部分責任是允許用戶訪問他們的資源,我們通過 RBAC 來分配合理的權限並通過 kubectl 啓用用戶的查詢。對於後端開發人員來說 “沒有障礙”,而對於不熟悉命令行操作或 kubectl 、Web 和數據開發人員等用戶來說則不是這樣。那麼我們該如何爲用戶掃清障礙呢?我們通過 UI 可查詢界面實現了這一 ⌘ [Read more](https://www.readfog.com/a/1673579309689835520) 2022-07-11T14:36:27Z **Go 語言逃逸分析**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹熟悉 C / C++ 的讀者朋友們應該都知道一個進程(應用程序)的虛擬內存空間劃分爲棧內存區和堆內存區。棧內存區上對象的內存空間是自動分配和銷燬的,使用者無需關心。但是,堆內存區上對象的內存空間 ⌘ [Read more](https://www.readfog.com/a/1674076761750605824) 2022-07-11T14:46:25Z **Go 1-18 的那些事 -- 工作區、模糊測試、泛型**
前言--2022 年 3 月 15 日,Google 發佈了萬衆矚目的 Golang 1.18,帶來了好幾個重大的新特性,包括:解決本地同時開發多個倉庫帶來的一些問題的工作區(Workspace) 能夠自動探測代碼分支,隨機生成輸入,並且檢查代碼是否會 panic 的模糊測試(Fuzzing Test) 衆多開發者盼星星盼月亮終於等到的泛型支持。 本文將簡單講述這三個特性的相 ⌘ [Read more](https://www.readfog.com/a/1674077389746966528) 2022-07-11T14:40:37Z **超全總結:Go 語言如何操作文件**
前言\-\- 哈嘍,大家好,我是asong。 我們都知道在Unix中萬物都被稱爲文件,文件處理是一個非常常見的問題,所以本文就總結了Go語言操作文件的常見方式,整體思路如下:Go 語言版本:1.18本文所有代碼已經上傳github:https://github.com/asong2020/GolangDream/tree/master/codedemo/fileoperatedemo操作文件包 ⌘ [Read more](https://www.readfog.com/a/1674077024696766464) 2022-07-12T03:53:42Z **Go 每日一庫之 godotenv**
簡介--twelve-factor 應用提倡將配置存儲在環境變量中。任何從開發環境切換到生產環境時需要修改的東西都從代碼抽取到環境變量裏。 但是在實際開發中,如果同一臺機器運行多個項目,設置環境變量容易衝突,不實用。godotenv 庫從.env文件中讀取配置, 然後存儲到程序的環境變量中。在代碼中可以使用讀取非常方便。godotenv源於一個 Ruby 的開源項目 dotenv。快速使用-- ⌘ [Read more](https://www.readfog.com/a/1674126921090306048) 2022-07-12T14:46:21Z **十年磨一劍 go 1-18 泛型**
泛型引入了抽象,無用的抽象帶來複雜性。什麼是泛型-----泛型程序設計(generic programming)是程序設計語言的一種風格或範式。泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以後才指定的類型,在實例化時作爲參數指明這些類型。各種程序設計語言和其編譯器、運行環境對泛型的支持均不一樣。Java 和 C# 稱之爲泛型(generics)ML、Scala 和 Haskell 稱 ⌘ [Read more](https://www.readfog.com/a/1674167982247481344) 2022-07-12T14:45:05Z **編寫 go 語言代碼三條基本原則**
這是一篇翻譯文章,爲了使讀者更好的理解,會在原文翻譯的基礎增加一些講解或描述。 軟件工程是當您添加時間和其他程序員時編程發生的事情。— Russ CoxRuss 正在區分軟件編程和軟件工程。前者是您爲自己編寫的程序,後者是隨着時間的推移許多人會使用的產品。工程師會來來去去,團隊會擴大和縮小,需求會改變,功能會被添加,錯誤會被修復。這是軟件工程的本質。三條基本原則清晰可讀 化繁爲簡 生 ⌘ [Read more](https://www.readfog.com/a/1674167901882519552) 2022-07-13T14:38:00Z **Go: 在回覆HTTP請求後忘記寫return**
在編寫 HTTP 處理程序時,容易在已經回覆 HTTP 請求後忘記返回語句。這可能會導致奇怪的事情產生,我們期望在發生錯誤後停止處理程序,然而實際中並沒有停止。下面的例子描述了這種情況。func handler(w http.ResponseWriter, req http.Request) {        err := foo(req)        if err != nil { ⌘ [Read more](https://www.readfog.com/a/1674258053853188096) 2022-07-14T03:40:54Z **Windows 系統的 Gopher 們久等了!!**
。今天我們將介紹《如何在 Windows 10 上安裝 Go 和設置本地編程環境》,以供不同系統使用者選擇學習。話不多說,我們開始 : 如何在 Windows 10 上安裝 Go 和設置本地編程環境Go 語言簡介-------Go 是一門在 Google 備受挫折後而誕生的語言。開發者不得不頻繁地在兩門語言中選擇,要麼選擇一門執行效率高但是編譯時間長的語言,要麼選擇一種易於編程但在生產中運行效率低 ⌘ [Read more](https://www.readfog.com/a/1674307309188255744) 2022-07-15T04:27:13Z **試試動 Go recover 刀子,看看能不能優化錯誤處理?**
大家好,我是煎魚。Go 的錯誤處理一直是表現最突出的一塊地方,許許多多的同學都提出了各種提案,例如:引入 try-catch、用 panic 代替 if err != nil、引入新的關鍵字等。但這些都被一一駁回了。不過社區依然還沒放棄,週末看到有一個新的提案《proposal: runtime: add parameters to recover to only return specific ⌘ [Read more](https://www.readfog.com/a/1674400820692619264) 2022-07-18T03:24:21Z **拒絕 Go 代碼臃腫,其實在這幾塊可以用下觀察者模式**
今天學習一下用 Go 實現觀察者模式,觀察者模式主要是用來實現事件驅動編程。事件驅動編程的應用還是挺廣的,除了我們都知道的能夠用來解耦:用戶修改密碼後,給用戶發短信進行風險提示之類的典型場景,在微服務架構實現最終一致性、實現事件源(A + ES)這些都會用到。我們先來簡單學習一下用 Go 實現觀察者設計模式,給怎麼實現事件驅動編程、事件源這些模式做個鋪墊。主要也是我也老沒看設計模式了,一起再複習一 ⌘ [Read more](https://www.readfog.com/a/1674668656083177472) 2022-07-18T03:23:11Z **Go 每日一庫之 bitset**
簡介--我們都知道計算機是基於二進制的,位運算是計算機的基礎運算。位運算的優勢很明顯,CPU 指令原生支持、速度快。基於位運算的位集合在有限的場景中替換集合數據結構可以收到意想不到的效果。bitset庫實現了位集合及相關操作,不妨拿來即用。安裝--本文代碼使用 Go Modules。創建目錄並初始化:$ mkdir -p bitset && cd bitset$ go mod init githu ⌘ [Read more](https://www.readfog.com/a/1674668582623088640) 2022-07-18T10:34:24Z **使用 Go 基於國密算法實現雙向認證**
國內做 2B(to Biz) 或 2G(to Gov) 產品和解決方案的企業都繞不過國密算法,越來越多的國內甲方在採購需求中包含了基於國密算法的認證、簽名、加密等需求。對於國內的車聯網平臺來說,支持基於國密的雙向認證也是大勢所趨。在這篇文章中,我就來說說如何基於國密算法實現雙向認證,即使用國密算法的安全傳輸層雙向認證。 一. 簡要回顧基於 TLS 的雙向認證在《Go 語言精進之路》[1] 第 2 ⌘ [Read more](https://www.readfog.com/a/1674695712858804224) 2022-07-18T10:51:03Z **Go 垃圾回收器指南**
簡介--本指南旨在幫助高級 Go 語言用戶更好地瞭解 Go 語言垃圾回收器的使用成本。它還提供了 Go 用戶如何利用這些知識來提高應用程序的資源利用率的指導。它並不假設你瞭解垃圾回收,但假設你熟悉 Go 語言。Go 語言負責安排 Go 語言值的存儲。在大多數情況下,Go 語言開發人員根本不需要關心這些值存儲在哪裏,或者爲什麼要存儲。然而,在實踐中,這些值通常需要存儲在計算機物理內存中,而物理內存是 ⌘ [Read more](https://www.readfog.com/a/1674696759782248448) 2022-07-19T12:44:01Z **Go 語言中的數據競爭模式**
譯者 \| 陳峻 策劃 \| 雲昭本文主要基於在 Uber 的 Go monorepo 中發現的各種數據競爭模式,分析了其背後的原因與分類,希望能夠幫助更多的 Go 開發人員,去關注併發代碼的編寫,考慮不同的語言的特性、以及避免由於自身編程習慣所引發的併發錯誤。近年來,Uber 已經開始採用 Golang(簡稱 Go)作爲開發微服務的主要編程語言。目前,其 Go monorepo(譯者注:包含多個不 ⌘ [Read more](https://www.readfog.com/a/1674794464406769664) 2022-07-19T13:01:51Z **學會 Go 中的時間處理**
作爲程序員,我們經常需要對時間進行處理。在 Go 中,標準庫 time 提供了對應的能力。本文將介紹 time 庫中一些重要的函數和方法,希望能幫助到那些一遇到 Go 時間處理問題就需要百度的童鞋。應對時區問題------在編程中,我們經常會遭遇八小時時間差問題。這是由時區差異引起的,爲了能更好地解決它們,我們需要理解幾個時間定義標準。GMT(Greenwich Mean Time),格林威治平時 ⌘ [Read more](https://www.readfog.com/a/1674795585917521920) 2022-07-19T13:00:31Z **Go 方法選擇器的正規化**
Go 允許一些選擇器的簡化形式。例如,在下面這個程序中,t1.M1 是 (t1).M1 的簡化形式,而 t2.M2 則是 (&t2).M2 的簡化形式。在編譯時,編譯器將把簡化的形式正規化爲它們原來各自的完整形式。下面這個程序打印出 0 和 9,因爲對 t1.X 的修改對 (t1).M1 的估值結果沒有影響。package maintype T struct { X int}func (t T) ⌘ [Read more](https://www.readfog.com/a/1674795502637518848) 2022-07-19T13:08:29Z **Golang 泛型初識**
本文主要是介紹 Golang 泛型的基本要素,泛型的一些通用代碼的實踐。 分爲以下四個部分 1. 簡介 2. 泛型的基本元素 3. 泛型實踐 4. 總結 簡介--泛型是什麼?泛型編程是一種計算機編程風格,編程範式,其中算法是根據稍後指定的類型編寫的,然後在需要時爲作爲參數提供的特定類型實例化。常用的的編程語言也基本都支持泛型這一特性,例如 C++、C#、 ⌘ [Read more](https://www.readfog.com/a/1674796003122843648) 2022-07-20T03:14:54Z **如何用 Go 實現一個異步網絡庫?**
導語 \| 在需要高性能、節省資源的場景下,比如海量的連接、很高的併發,我們發現 Go 開始變得喫力,不但內存開銷大,而且還會有頻繁的 goroutine 調度。GC 時間也變得越來越長,甚至還會把系統搞掛。這時,我們就可以考慮用 Go 構建經典的 Reactor 網絡模型,來應對這種場景。一、常見的服務端網絡編程模型在具體講 Reactor 網絡庫的實現前,我們先快速回顧下常見的服務端網絡編程模型 ⌘ [Read more](https://www.readfog.com/a/1674849255441928192) 2022-07-21T14:07:14Z **把「Go 靜態分析」放進你的工具箱**
背景--提到靜態分析,大家第一反應可能是 Sonar、FindBugs 等靜態代碼檢查工具,它通過對源碼的分析,不實際運行代碼,檢查代碼是否符合編碼規範,發現源碼中潛在的漏洞。這當中主要通過靜態編譯相關技術,其實大家在日常的業務代碼開發過程中藉助 IDE,使用的代碼格式化、查找某方法的定義 / 調用等功能也是基於這套技術實現的。本文期望擴充靜態分析的定義,泛指所有通過靜態編譯相關技術實現的工具,不 ⌘ [Read more](https://www.readfog.com/a/1674980893988589568) 2022-07-21T14:12:55Z **Go 每日一庫之 roaring**
簡介--集合是軟件中的基本抽象。實現集合的方法有很多,例如 hash set、tree 等。要實現一個整數集合,位圖(bitmap,也稱爲 bitset 位集合,bitvector 位向量)是個不錯的方法。使用 n 個位(bit),我們可以表示整數範圍[0, n)。如果整數 i 在集合中,第 i 位設置爲 1。這樣集合的交集(intersection)、並集(unions)和差集(differen ⌘ [Read more](https://www.readfog.com/a/1674981251791032320) 2022-07-25T03:03:54Z **使用 OpenCensus 跟蹤 Gorm 查詢**
Gorm 作爲 Go 語言中很常用的一個 ORM 庫,功能非常強大。應用程序的大量時間都花在通過 gorm 與數據庫連接上面,所以我們想在鏈路跟蹤中獲得更好的視圖。幸運的是,Gorm 有完美的鉤子,我們可以通過 Callbacks API 將跟蹤功能注入到數據庫處理當中。Callbacks API 允許我們爲 Gorm 提供在查詢生命週期的特定部分中執行相應的函數,或者允許您在傳統的中間件方法中更 ⌘ [Read more](https://www.readfog.com/a/1675301547755540480) 2022-07-25T02:52:49Z **這十二個 Go 語法糖,利好每日摸魚**
前言\-\- 每門語言都有自己的語法糖,像java的語法糖就有方法變長參數、拆箱與裝箱、枚舉、for-each等等,Go語言也不例外,其也有自己的語法糖,掌握這些語法糖可以助我們提高開發的效率,所以本文就來介紹一些Go語言的語法糖,總結的可能不能全,歡迎評論區補充。可變長參數-----Go語言允許一個函數把任意數量的值作爲參數,Go語言內置了... 操作符,在函數的最後一個形參才能使用... 操作符 ⌘ [Read more](https://www.readfog.com/a/1675300850567843840) 2022-07-25T03:09:36Z **Go 原生插件使用問題全解析**
導言本人在設計和落地基於 Go 原生插件機制的擴展開發產品時踩到了很多坑,由於這方面相關資料很少,因而藉此機會做一個非常粗淺的總結,希望能對大家有所幫助。本文只說問題和解決方案,不讀代碼。一些背景知識2.1 運行時通常而言,在計算機編程語言領域,“運行時”的概念和一些需要使用到 vm 的語言相關。程序的運行由兩個部分組成:目標代碼和 “虛擬機”。比如最爲典型的 JAVA,即 Java Class ⌘ [Read more](https://www.readfog.com/a/1675301907043815424) 2022-07-25T09:59:30Z **Go 語言內存逃逸案例**
01 介紹在「Go 語言逃逸分析」中,我們瞭解到內存分配的相關知識,棧空間分配開銷小,堆空間分配開銷大。Go 語言編譯器可以通過逃逸分析決定內存分配到棧空間或堆空間。但是,分配到棧空間的對象在某些情況中會逃逸到堆空間。我們可以使用 Go 工具鏈查看對象是否發生內存逃逸。爲了提升 Go 應用程序的性能,我們應該避免 Go 應用程序中出現內存逃逸的現象,本文我們介紹 Go 語言內存逃逸的幾種典型案例。 ⌘ [Read more](https://www.readfog.com/a/1675327695923286016) 2022-07-25T10:09:03Z **使用 expvar 暴露 Go 程序運行指標**
獲取應用程序的運行指標,可以讓我們更好地瞭解它的實際狀況。將這些指標對接到 prometheus、zabbix 等監控系統,能夠對應用程序持續檢測,發現異常可以及時告警並得到處理。Pull 與 Push-----------與監控系統對接方式有兩種,一種是 Pull(拉取),另外一種 Push(推送)。以 Prometheus 爲例,應用程序通過暴露出 HTTP 接口,讓 Prometheus 週 ⌘ [Read more](https://www.readfog.com/a/1675328296004456448) 2022-07-25T11:40:47Z **Go 上下文 context 底層原理**
context 介紹-------------很多時候,我們會遇到這樣的情況,上層與下層的 goroutine 需要同時取消,這樣就涉及到了 goroutine 間的通信。在 Go 中,推薦我們以通信的方式共享內存,而不是以共享內存的方式通信。所以,就需要用到 channl,但是,在上述場景中,如果需要自己去處理 channl 的業務邏輯,就會有很多費時費力的重複工作,因此,context 出現了 ⌘ [Read more](https://www.readfog.com/a/1675334067935088640) 2022-07-25T11:38:14Z **Go 語言中常見問題 - 忽視表驅動測試**
表驅動測試是編寫精簡測試的一種有效技術。它減少了樣板代碼(具有固定模式的代碼塊,冗餘但是又不得不寫),幫助我們更加專注於重要的事情:測試邏輯。本文將通過一個具體的例子來說明爲什麼使用表驅動測試值得我們瞭解。下面函數實現的功能是將給定字符串的後綴 \ n 或 \ r\\n 全部刪除,直到末尾不含換行符 \ n 或 \ r\\n 終止。func removeNewLineSuffixes(s string ⌘ [Read more](https://www.readfog.com/a/1675333907742035968) 2022-07-25T14:49:17Z **圖解 Go 協程原理及實戰**
引言Golang 的語法和運行時直接內置了對併發的支持。Golang 裏的併發指的是能讓某個函數獨立於其他函數運行的能力。當一個函數創建爲 goroutine 時,Golang 會將其視爲一個獨立的工作單元。這個單元會被調度到可用的邏輯處理器上執行。Golang 運行時的調度器是一個複雜的軟件,能管理被創建的所有 goroutine 併爲其分配執行時間。這個調度器在操作系統之上,將操作系統的線程與 ⌘ [Read more](https://www.readfog.com/a/1675345927392563200) 2022-07-25T14:46:35Z **Go:說說 log-Fatal 和 panic 的區別**
要熟悉兩者區別之前,需要先了解 os.Exit() 函數。我這裏截一張 Go 源碼裏面的解釋:我們需要注意兩點:1、應用程序會被馬上退出2、defer 函數不會被執行你可以理解這就是直接 kill -9 程序,不給任何喘氣的機會。現在我們再來看看 log.Fatal 函數的定義:整體來說,他在 os.Exit() 之前做了一個日誌輸出。他的流程可以理解是:1、打印輸出內容2、退出應用程序3、def ⌘ [Read more](https://www.readfog.com/a/1675345757011546112) 2022-07-26T02:28:56Z **Go 語言 GC 原理和實踐精講**
—1 — 簡介本指南旨在幫助高級 Go 語言用戶更好地瞭解 Go 語言垃圾回收器的使用成本。它還提供了 Go 用戶如何利用這些知識來提高應用程序的資源利用率的指導。它並不假設你瞭解垃圾回收,但假設你熟悉 Go 語言。Go 語言負責安排 Go 語言值的存儲。在大多數情況下,Go 語言開發人員根本不需要關心這些值存儲在哪裏,或者爲什麼要存儲。然而,在實踐中,這些值通常需要存儲在計算機物理內存中,而物 ⌘ [Read more](https://www.readfog.com/a/1675389945256185856) 2022-07-26T15:43:41Z **golang 協程設計與調度原理**
協程設計 \- GMP 模型-------------線程是操作系統調度到 CPU 中執行的基本單位,多線程總是交替式地搶佔 CPU 的時間片,線程在上下文的切換過程中需要經過操作系統用戶態與內核態的切換。golang 的協程 (G) 依然運行在工作線程 (M) 之上,但是藉助語言的調度器,協程只需要在用戶態即可完成切換,工作線程是感受不到協程存在的。golang 在設計上通過邏輯處理器 (P) 建 ⌘ [Read more](https://www.readfog.com/a/1675439946220015616) 2022-07-28T03:26:59Z **從 -go 文本文件到可執行文件**
Go 是一門編譯型語言,我們平時所編寫的 .go 文本文件稱爲源文件,源文件裏面的內容就是我們的源代碼。源代碼要想在目標機器上運行,就必須使用 Go compiler (縮寫 gc ,指代 Go 編譯器)將其先編譯成操作系統能夠直接識別的二進制機器碼文件,或說可執行文件。後續由操作系統加載該文件,並在 CPU 中直接運行機器碼。這也是編譯型語言運行效率高的主要原因。Go compiler 是用什麼 ⌘ [Read more](https://www.readfog.com/a/1675574791556403200) 2022-07-29T04:28:24Z **Go 每日一庫之一個好玩的 Go 語言 REPL 工具**
簡介--週末閒逛 GitHub 的時候發現一個很好玩的 Go 語言的 REPL(read-eval-print-loop)工具。本文和大家分享一下這個工具:gore。首先放一張 GitHub 的動圖感受一下:快速使用----gore 是一個命令行工具,需要配合 Go Module 安裝。Go 環境安裝完成之後,執行下面的命令安裝 gore:$ go install github.com/x-mot ⌘ [Read more](https://www.readfog.com/a/1675669252051406848) 2022-07-29T06:35:31Z **如何使用 Elastic APM Go 代理爲 Go 應用裝載測量工具**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。Elastic APM[1](應用程序性能監測)能夠全面洞見應用程序性能和洞悉分佈式工作負載,且正式支持多種語言,包括 Go[2]、Java[3]、Ruby[4]、Python[5] 和 JavaScript(Node.js[6] 和用於瀏覽器的真實用戶監測 [7] (RUM))。要獲得這些對性能的洞 ⌘ [Read more](https://www.readfog.com/a/1675677250399342592) 2022-08-01T03:14:44Z **不想 Go 錯誤處理太臃腫,可以參考這個代碼設計**
最近寫了個程序,因爲是急活(貌似沒有不急的...),所以這個程序又是我東拷一段,西粘一塊拼出來的。代碼寫完了後,感覺這代碼屎一樣,都快把自己看哭了。真的是在心裏邊寫別罵,先是罵以前做這個項目的人蠢,項目搞的跟屎一樣,後來代碼跑起來了,順利交工後,變成了罵我自己蠢,這麼寫又不是不能用!不過在這個過程中,先不提項目裏的業務邏輯、接口設計合不合理的事兒,這個我覺得在時間緊,加上人員更迭快的時候,正常人都 ⌘ [Read more](https://www.readfog.com/a/1675936408786800640) 2022-08-01T04:32:55Z **Go 語言短變量聲明的 “坑”**
01 介紹在使用 Go 語言進行項目開發時,我們經常會在定義變量時使用 Go 語言的一個語法糖 - 短變量聲明,它雖然好用,但是也會有讓我們不小心就會掉進的 “坑”。本文我們介紹一個 Go 語言短變量聲明最容易讓程序員掉進的 “坑”。02 短變量聲明的 “坑”Go 語言提供了短變量聲明的語法糖,短變量聲明讓 Go 語言的變量聲明更加方便,代碼更加簡潔。但是,它真的百利無一害嗎?我們先閱讀一段示例代 ⌘ [Read more](https://www.readfog.com/a/1675941327667302400) 2022-08-01T09:16:40Z **7 年後,發現用 Go 實現 CockroachDB 是正確的選擇**
大家好,我是程序員幽鬼。分享 CockroachDB 團隊使用 Go 的體會。 在 7 年前(2051 年 11 月 3 日),選擇用 Go 實現 CockroachDB。現在回顧當初的選擇。許多開發人員問我們的第一個問題是,我們在使用垃圾收集語言 Go 編寫分佈式數據庫方面的經驗是什麼。JVM 垃圾收集是出了名的昂貴(耗資源),所以我們用 Go 構建 CockroachDB 不是冒性能風險嗎?事 ⌘ [Read more](https://www.readfog.com/a/1675959179066576896) 2022-08-03T08:47:01Z **Go 語言標準庫中最常用的標識符是什麼?**
爭做團隊核心程序員,關注「幽鬼」這篇文章是來自最新 justforfunc[1] 中同標題的一段。這個程序的代碼 [2] 可以在 justforfunc 倉庫 [3] 中找到。問題陳述----想象一下,對於下面的代碼段,你如何將其中所有的標識符都提取出來。package mainimport "fmt"func main() { fmt.Println("Hello, world")}我們期望可以 ⌘ [Read more](https://www.readfog.com/a/1676138507664461824) 2022-08-04T06:51:29Z **細嗦 Golang 的指針**
與 C 語言一樣,Go 語言中同樣有指針,通過指針,我們可以只傳遞變量的內存地址,而不是傳遞整個變量,這在一定程度上可以節省內存的佔用,但凡事有利有弊,Go 指針在使用也有一些注意點,稍不留神就會踩坑,下面就讓我們一起來細嗦下。1. 指針類型的變量在 Golang 中,我們可以通過取地址符號 & 得到變量的地址,而這個新的變量就是一個指針類型的變量,指針變量與普通變量的區別在於,它存的是內存地址, ⌘ [Read more](https://www.readfog.com/a/1676221836278468608) 2022-08-04T06:52:28Z **函數式編程在 Go 泛型下的實用性探索**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。 歡迎大家加入 Go 招聘交流羣,來這裏找志同道合的小夥伴!跟土撥鼠們一起交流學習。背景--函數式編程(Functional Programming / FP)作爲一種編程範式,具有無狀態、無副作用、併發友好、抽象程度高等優點。目前流行的編程語言(C++、Python、Rust)都或多或少地引入 ⌘ [Read more](https://www.readfog.com/a/1676221897646379008) 2022-08-05T04:22:39Z **可視化 Go 內存管理**
在本章中,我們將研究 Go 編程語言(Golang)[1] 的內存管理。和 C/C++、Rust 等一樣,Go 是一種靜態類型的編譯型語言。因此,Go 不需要 VM,Go 應用程序二進制文件中嵌入了一個小型運行時 (Go runtime),可以處理諸如垃圾收集 (GC),調度和併發之類的語言功能。Go 內部內存結構---------首先,讓我們看看 Go 內部的內存結構是什麼樣子的。 Go 運行 ⌘ [Read more](https://www.readfog.com/a/1676303069283979264) 2022-08-09T03:05:46Z **Go 語言使用 goroutine 運行閉包的 “坑”**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在 Go 語言中,函數支持匿名函數,閉包就是一種特殊的匿名函數,它可以用於訪問函數體外部的變量。需要注意的是,在 for ... range ... 中,使用 goroutine 執行閉包時,經 ⌘ [Read more](https://www.readfog.com/a/1676660619749724160) 2022-08-09T03:04:38Z **一文搞懂 go gc 垃圾回收原理**
什麼是垃圾回收-------我們在程序中定義一個變量,會在內存中開闢相應內存空間進行存儲,當不需要此變量後,需要手動銷燬此對象,並釋放內存。而這種對不再使用的內存資源進行自動回收的功能即爲垃圾回收(Garbage Collection,縮寫爲 GC),是一種自動內存管理機制如何識別垃圾------引用計數算法 (reference counting)引用計數通過在對象上增加自己被引用的次數,被其他 ⌘ [Read more](https://www.readfog.com/a/1676660549270736896) 2022-08-09T03:10:15Z **搞清楚 Go Mod 的版本和僞版本,下次別亂用了**
關於 Go 項目的依賴管理的日常使用以及遇到的問題怎麼解決,俺已經寫過兩篇文章了。項目使用 GoModules 管理依賴的方法和經驗總結 Go Modules 怎麼管理私有依賴 今天再跟大家嘮一下 Go Module 中軟件包的版本和僞版本的內容,因爲這是一個理想很豐滿、現實很骨感的故事。Module 的版本----------關於 Go Module 依賴包的軟件版本,這塊知識就很中 ⌘ [Read more](https://www.readfog.com/a/1676660902042112000) 2022-08-09T03:09:04Z **Go 結合反射輕鬆將結構體轉換成 Excel**
Excel 中的一些概念------------ 1. 一個 excel 文件中可以包含多個sheet,一個sheet可以理解成一個表格 2. 表格的每一行稱爲 Row 3. 表格的每一行中的任意一個單元格稱爲 Cell 使用tealeg操作 Excel------------------安裝tealeggo get github.com/tealeg/xlsx使用t ⌘ [Read more](https://www.readfog.com/a/1676660827632013312) 2022-08-09T03:07:27Z **Go 每日一庫之 Redis Web 端管理工具**
GRM 是基於 go+vue 的 web 版 redis 管理工具,部署簡單便捷,支持 SSH 連接,用戶校驗,操作日誌、命令行模式、LUA 腳本執行等功能。介紹基於 go+vue 的 web 版 redis 管理工具【Web redis management tool based on golang and vue】功能清單管理連接 (直連和 SSH)、切換 DB 支持 string/li ⌘ [Read more](https://www.readfog.com/a/1676660725863518208) 2022-08-11T02:43:49Z **面試官:哥們 Go 語言互斥鎖瞭解到什麼程度了?**
前言\-\- 哈嘍,大家好,我是asong。 當提到併發編程、多線程編程時,都會在第一時間想到鎖,鎖是併發編程中的同步原語,他可以保證多線程在訪問同一片內存時不會出現競爭來保證併發安全;在Go語言中更推崇由channel通過通信的方式實現共享內存,這個設計點與許多主流編程語言不一致,但是Go語言也在sync包中提供了互斥鎖、讀寫鎖,畢竟channel也不能滿足所有場景,互斥鎖、讀寫鎖的使用與我 ⌘ [Read more](https://www.readfog.com/a/1676840433553084416) 2022-08-11T02:42:44Z **Go 每日一庫之微服務開發框架 DMicro 的設計思路**
來源 \| OSCHINA 社區 作者 \| ClownFish原文鏈接:https://my.oschina.net/clownfish/blog/5560923DMicro 源碼地址:GitHub: https://github.com/osgochina/dmicro Gitee: https://gitee.com/osgochina/dmicro 背景--DMicro 誕生的背 ⌘ [Read more](https://www.readfog.com/a/1676840365087363072) 2022-08-12T04:06:20Z **負載均衡原理分析與源碼解讀**
上一篇文章一起學習了 Resolver 的原理和源碼分析,本篇繼續和大家一起學習下和 Resolver 關係密切的 Balancer 的相關內容。這裏說的負載均衡主要指數據中心內的負載均衡,即 RPC 間的負載均衡。傳送門 服務發現原理分析與源碼解讀基於 go-zero v1.3.5 和 grpc-go v1.47.0負載均衡----每一個被調用服務都會有多個實例,那麼服務的調用方應該將請求,發向 ⌘ [Read more](https://www.readfog.com/a/1676936221999337472) 2022-08-15T14:12:28Z **最簡單的單例模式,Go 版本的實現你寫對了嗎?**
大家好,我是網管,首先我問大家一個問題,你們面試的時候,面試官有沒有問過你們:"你都用過什麼設計模式?",我猜多數人的回答會把單例模式,放在第一位。我:"呃… 我用過單例、工廠、觀察者,反向代理,裝飾器,哨兵"…. ",面試官內心 OS:"我都沒用過這麼多... 反向代理是什麼鬼,這小子背串了吧,不管了先就坡下驢,從頭開始問"。面試官:"用過的挺多哈,那麼你能說下單例你都在什麼情況下用,順便在這張 ⌘ [Read more](https://www.readfog.com/a/1677246147645771776) 2022-08-15T14:10:23Z **夥計,Go 項目怎麼使用枚舉?**
前言\-\- 哈嘍,大家好,我是asong。枚舉是一種很重要的數據類型,在java、C語言等主流編程語言中都支持了枚舉類型,但是在 Go 語言中卻沒有枚舉類型,那有什麼替代方案嗎?本文我們來聊一聊這個事情;爲什麼要有枚舉-------我們以java語言爲例子,在JDK1.5之前沒有枚舉類型,我們通常會使用int常量來表示枚舉,一般使用如下:public static final int COLORR ⌘ [Read more](https://www.readfog.com/a/1677246015699259392) 2022-08-16T13:15:38Z **Go 語言怎麼處理三方接口返回數據?**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在使用 Go 語言調用三方RESTful接口時,因爲無法直接操作 json 字符串,所以我們需要先將 json 字符串轉換爲 map 或 struct。本文我們介紹一下怎麼處理三方接口返回數據。 ⌘ [Read more](https://www.readfog.com/a/1677333168811773952) 2022-08-17T03:50:03Z **Go 只會 if err -- nil?這是不對的,分享這些優雅的處理姿勢給你!**
大家好,我是煎魚。本篇仍然是錯誤專場,是 Go 諺語中的 Don't just check errors, handle them gracefully[1],原文章同名,作者是 @Dave Cheney。以下的 “我” 均指代原作者。這條諺語和 Errors are value 關聯性很強,是互解答的,和煎魚一起學習吧!錯誤只是值-----我花了很多時間來思考處理 Go 程序中錯誤的最佳方法。我 ⌘ [Read more](https://www.readfog.com/a/1677388182212153344) 2022-08-17T09:43:22Z **Go 中處理字符串的介紹**
字符串是由一個或多個字符 (字母、數字、符號) 組成的序列,這些字符可以是常量,也可以是變量。字符串由 Unicode 組成,是不可變的序列,這意味着它們是不變的。因爲文本是我們日常生活中使用的常見數據形式,所以字符串數據類型是編程中一個非常重要的基石。本 Go 教程將介紹如何創建和打印字符串,如何連接和複製字符串,以及如何在變量中存儲字符串。字符串文字-----在 Go 中,字符串存在於反引號 ⌘ [Read more](https://www.readfog.com/a/1677410410355068928) 2022-08-17T14:09:26Z **gomonkey 用戶如何對泛型打樁**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。問題的由來-----在 gomonkey[1] 社區,用戶 ericuni 提了一個 issue[2],如下圖所示:issue-95.png泛型是 Go1.18 引入的一個新特性,筆者在本地升級 Go 版本到 Go1.18,復現了問題。 (1)產品代碼示例:func AddT int \| float ⌘ [Read more](https://www.readfog.com/a/1677427150248054784) 2022-08-19T06:50:36Z **Go 編譯器優化**
死代碼消除死代碼消除( dead code elimination, 縮寫 DCE )是用來移除對程序執行結果沒有任何影響的代碼,以此 減少程序的體積大小 ,並且還可以避免程序在執行過程中進行一些不必要的運算行爲,從而 減少執行時間 。需要注意的是,除了不會執行到的代碼( unreachable code ),一些只會影響到無關程序執行結果的變量( dead variables ),也屬於死碼( ⌘ [Read more](https://www.readfog.com/a/1677580734629515264) 2022-08-19T06:49:07Z **Go 眼中的文件系統是什麼? io-FS**
什麼神奇問題 ?Go 在文件 IO 的場景有個神奇的事情。打開一個文件的時候,返回的竟然不是 interface ,而是一個 os.File  結構體的指針。func Open(name string) (File, error) {    return OpenFile(name, O\_RDONLY, 0)}劃重點:這個意味着,Go 的文件系統的概念和 OS 的文件系統的概念直接關聯起來。你必須 ⌘ [Read more](https://www.readfog.com/a/1677580641966854144) 2022-08-19T06:48:21Z **Go:服務發現原理分析與源碼解讀**
在微服務架構中,有許多繞不開的技術話題。比如服務發現、負載均衡、指標監控、鏈路追蹤,以及服務治理相關的超時控制、熔斷、降級、限流等,還有 RPC 框架。這些都是微服務架構的基礎,只有打牢這些基礎,纔敢說對微服務是有了一點理解,出門也好意思和別人打招呼了,被人提問的時候也能侃侃而談了,線上出了問題往往也能尋根溯源內心不慌了,旁邊的女同事小芳看着你的時候也是滿眼的小可愛了。在《微服務實踐》公衆號,之前 ⌘ [Read more](https://www.readfog.com/a/1677580593615966208) 2022-08-22T07:08:12Z **Go 1-19 中的原子指針**
在計算機編程中,” 原子” 是指一次執行一個操作。Objective-C有原子屬性,它確保了從不同的線程對一個屬性進行安全的讀寫。在Objective-C中,它是與不可變類型一起使用的。這是因爲爲了改變不可變類型,實際上是 “重新創建” 它。換句話說,在你的代碼中改變一個不可變的類型不會導致編譯器拋出一個錯誤。然而,當你這樣做的時候,它會實例化一個新的對象。一個典型的例子是Go的append函數, ⌘ [Read more](https://www.readfog.com/a/1677853633213992960) 2022-08-22T13:14:18Z **Go 組件:context 學習筆記!**
最近學習 go 有一段時間了,在網上一直看到別人推薦,學 go 可以學習裏面的 context 源碼,短小精悍。看了下確實有所收穫,本文是基於我最近對 context 源碼學習的一些心得積累,望大家不吝賜教。一、爲什麼使用 Context(一)go 的扛把子----------要論 go 最津津樂道的功能莫過於 go 強大而簡潔的併發能力。func main(){ go func(){ f ⌘ [Read more](https://www.readfog.com/a/1677876666118017024) 2022-08-23T03:33:34Z **Go 減少代碼的嵌套層數**
軟件開發中的 “心智模型” 用於描述開發人員在編碼時心理活動,每段代碼其實是人在編寫這段代碼時的心智模型投射,不能把代碼看成是客觀的存在,而是主觀的產物,參合了當時心理活動或各種直覺感知。在編程時,必須不斷維護心智模型,例如關於整體代碼交互和功能實現的心智模型,代碼是否具有可讀性,代碼風格,變量命名規範等。可讀性強的代碼需要的心智模型更簡單,更容易閱讀和維護。代碼嵌套層級的數量是影響可讀性的一個關 ⌘ [Read more](https://www.readfog.com/a/1677930726696259584) 2022-08-23T11:04:38Z **Golang 中反射的應用與理解**
首先來一段簡單的代碼邏輯熱身,下面的代碼大家覺得應該會打印什麼呢?type OKR struct { id int content string}func getOkrDetail(ctx context.Context, okrId int) (OKR, okrErr.OkrErr) { return &OKR{id: okrId, content: fmt.Sprint( ⌘ [Read more](https://www.readfog.com/a/1677959105334054912) 2022-08-25T03:12:10Z **如何在 Gin 框架中使用泛型構建完全解耦的請求驗證層**
請求驗證可能是任何 Web 框架中最無聊但最關鍵的中間層。今天,我將展示在 golang 中的 gin 框架 中(使用泛型)的正確實踐。1. 目標---------Gin 與 validator 庫集成以進行請求驗證,即 模型綁定與驗證。我們將在很大程度上依靠這一點來實現我們的目標。我們的目標是: 構建一個抽象,通過這個抽象使得請求驗證與請求處理程序完全解耦,例如,在您的常規 gin 的 han ⌘ [Read more](https://www.readfog.com/a/1678110574293127168) 2022-08-26T08:36:22Z **VSCode 安裝 Go 環境(詳細教程)**
一、前言----最近算法本身工作第一階段目標也算接近完成了,接下來將模型進行部署的工作,算法模型工程化,服務化。這塊主要是用 GO。還是挺期待學一門新的語言的,經過這麼多年的算法毒打,導致現在基本上只會寫寫調包的 python。之前學嵌入式 PID 啥的寫寄存器 C 語言能力,寫 android 和服務器的 java 能力基本上在我身上都消失了。接下來準備學習下 GO 了。二、IDE 的下載--- ⌘ [Read more](https://www.readfog.com/a/1678221568402100224) 2022-08-29T04:08:51Z **如何讓 Go 反射變快**
最近讀到一篇關於 Go 反射的文章,作者通過反射給結構體填充字段值的案例,充分利用 Go 的各種內在機理,逐步探討讓代碼運行得更快的姿勢。文章(原文地址:https://philpearl.github.io/post/aintnecessarilyslow/)非常有學習價值,故翻譯整理了下來。不要使用反射,除非你真的需要。但是當你不使用反射時,不要認爲這是因爲反射很慢,它也可以很快。反射允許你在 ⌘ [Read more](https://www.readfog.com/a/1678476528180105216) 2022-08-29T10:52:33Z **工廠模式有三個 Level,你能用 Go 寫到第幾層?**
設計模式中的工廠模式是我們編寫代碼時常用的一種建造型模式,用於創建指定類的實例。在不使用設計模式的時候,我們是怎麼創建類的實例的呢?別多想,這個問題沒坑,就是我們寫代碼時直接用 new 關鍵字,直接創建實例。比如 Java 語言裏是通過 new 關鍵字直接調用類的構造方法,完成實例的創建。class  Person {}Person p1 = new Person();而像 Go 語言這類,雖說是 ⌘ [Read more](https://www.readfog.com/a/1678501927207407616) 2022-08-30T03:09:20Z **Go 語言中常見問題 - 接口污染**
在 Go 語言中,接口是我們設計和編寫代碼的基石。然而,像很多概念一樣,濫用它是不好的。接口污染是指用不必要的抽象來編寫代碼(刻意使用接口),使得代碼更難以理解。這是具有不同習慣,特別是有其它語言開發經驗的人會犯的一個常見錯誤。在深入討論接口污染之前,讓我們重新梳理一下 Go 語言的接口,然後分析何時使用接口以及在什麼時候使用會存在污染問題。接口接口約定了對象的行爲方法,用於創建多個對象可以實現的 ⌘ [Read more](https://www.readfog.com/a/1678563380566265856) 2022-08-30T03:07:43Z **手把手教你實現 Golang 跨平臺編譯**
前言--大家好,我是星期八,是一個每天都要在鏡子前給自己梳僅剩三根頭髮的三年碼農。上面的文章,我們已經搭建了 Go 語言環境,可以戳這裏:手把手帶你進行 Golang 環境配置,還實現了第一個 Go 程序,本次我們來安排一下如何實現跨平臺編譯。跨平臺編譯-----跨平臺編譯,也叫交叉編譯,我可以在 win 平臺上,編譯成 linux 平臺可執行的文件。這也是 Go 備受青睞的原因,像 java,p ⌘ [Read more](https://www.readfog.com/a/1678563279147995136) 2022-08-30T03:11:36Z **一文徹底理解 Go 語言棧內存 - 堆內存**
計算機爲什麼需要內存?計算機是運行自動化程序的載體,程序 (或稱之爲進程) 由可執行代碼被執行後產生。那麼計算機在運行程序的過程中爲什麼需要「內存」呢?爲了輕鬆理解這個問題,我們先來簡單看看:代碼的本質 可執行代碼被執行後,程序的運行過程 代碼的本質-----簡單來看代碼主要包含兩部分:指令部分:中央處理器 CPU 可執行的指令 數據部分:常量等 代碼包含了指令,代碼被轉化 ⌘ [Read more](https://www.readfog.com/a/1678563523880390656) 2022-08-31T04:15:56Z **必擼系列!Go 另外幾個黑魔法技巧彙總**
而最近一段時間,筆者重新梳理了一下 go 知識點,並深入地看看了它的源碼,在實踐中又有了新的沉澱,於是寫下這篇文章和大家分享一下。一、魔法:最小化運行時 (minimal runtime)我們知道,go 有一層很重的運行時 (runtime),包括內存管理、goroutine 調度等重要組件;這些組件極大地方便了應用程序的開發和迭代,但也帶來了一些問題,比如:Go 程序自動接管了內存,並自帶 GC ⌘ [Read more](https://www.readfog.com/a/1678658167546941440) 2022-09-01T03:18:06Z **ngo:go 語言開發利器**
網易傳媒在 2021 年的時候就開始嘗試將線上的一些核心集羣使用 Go 語言進行重構,筆者有幸主導了本次 Go 語言重構,在本次重構中,爲了減少各業務不必要的調研時間,我們成立了一個攻堅小組,就業務用到的各種依賴進行了統一調研、封裝、測試,給各業務提供了統一的 Go 語言基礎框架,極大的增加了業務開發效率,避免了重複研究。之前筆者也就 Go 語言的一些特性、優勢及問題進行了闡述,說明了傳媒使用 G ⌘ [Read more](https://www.readfog.com/a/1678745125871783936) 2022-09-01T03:45:44Z **「Go 工具箱」強烈推薦:一個能讓 http 請求回放的工具**
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的實用的、好玩的工具。在工作中,你一定遇到過要在服務器上抓包的場景,可又苦於找不到合適的工具。今天就給大家推薦一個使用 go 語言編寫的抓包工具 goreplay。goreplay 是一個可以抓取實時網絡包的工具,在 github 上 star 值高達 16k。其抓包原理是基於 https://github.co ⌘ [Read more](https://www.readfog.com/a/1678746864832319488) 2022-09-01T03:51:38Z **輕量級限流工具 throttle**
throttled 是一個非常輕量且易擴展的限流組件,我們可以將它輕鬆地集成到應用程序中,以實現限流和配額管理的能力。簡介------throttled(https://github.com/throttled/throttled) 基於通用信元速率算法實現了對資源的訪問速率限制,資源可以是特定的 URL、用戶或者任何自定義的形式,可以很方便地與各種 http 和 rpc 框架進行集成。throt ⌘ [Read more](https://www.readfog.com/a/1678747236539928576) 2022-09-02T06:42:40Z **圖文結合!Redis 延遲隊列 golang 高效實踐**
導語 \| 本文主要講述如何使用 golang 基於 Redis 實現延遲消息隊列組件。希望對有需求的同學有所幫助。 一、背景業務中經常會有這樣的場景:到期後自動執行指定操作; 查詢某個任務是否完成,未完成等待一定時間再次查詢; 回調通知,當回調失敗時,等待後重試;等等還有其他很多類似的場景。 很多時候我們會直接通過一個本地定時器來幫我們完成這個任務。如果我們的系統是多實例分佈式 ⌘ [Read more](https://www.readfog.com/a/1678848594032037888) 2022-09-05T03:43:59Z **手寫了個可能是 Github 性能最強的 Go 跳錶**
作者:phongchen,騰訊 IEG 後臺開發工程師 2022 年 3 月,廣大人民期盼已久的支持的泛型的 go1.18 發佈了。但是目前基於泛型的容器實現還不多。我實現了一套類似 C++ 中 STL 的容器和算法庫。其中有序的 Map 選擇用跳錶來實現,並優化到了相當好的性能。在此分享一下優化的思路和心得,供大家參考借鑑,如果發現有錯誤也歡迎指出。一、背景首先爲標題黨致歉,不過確實沒吹牛 😊 ⌘ [Read more](https://www.readfog.com/a/1679109142550253568) 2022-09-05T10:27:24Z **如何在 Go 中使用變量和常量**
變量 是一個需要掌握的重要編程概念。它們是代表你在程序中使用的值的符號。本教程將介紹一些變量基礎知識和在你創建的 Go 程序中使用它們的最佳實踐。理解變量----用術語來說,變量將存儲位置分配給與符號名稱或標識符相關的值。我們使用變量名來引用計算機程序中存儲的值。我們可以將變量視爲帶有名稱的標籤,您可以將其綁定到值上。假設我們有一個整數 1032049348 ,我們希望將它存儲在一個變量中,而不 ⌘ [Read more](https://www.readfog.com/a/1679134523095355392) 2022-09-05T14:43:30Z **聊一聊跳錶數據結構**
背景------在討論那些 “不著名” 的數據結構時,跳錶經常會出現。但實際上它們並沒有那麼默默無聞,事實上許多生產級軟件都在積極地使用它們。在這篇文章中,我將描述如何製作一個玩具式的實現,以及潛在的性能優化和它們在現實世界中的使用案例,通過這三方面來探討跳錶。那麼什麼是跳錶呢?跳錶是一種指向性的數據結構,它的靈感來自鏈表和二叉樹。它們是排列在不同層級上的排序鏈表的集合,其中層級在設計上允許跳過部 ⌘ [Read more](https://www.readfog.com/a/1679150635882221568) 2022-09-05T14:59:10Z **使用 Go 語言完成 HTTP 文件上傳與下載**
爭做團隊核心程序員,關注「幽鬼」近我使用 Go 語言完成了一個正式的 Web 應用,有一些方面的問題在使用 Go 開發 Web 應用過程中比較重要。過去,我將 Web 開發作爲一項職業並且把使用不同的語言和範式開發 Web 應用作爲一項愛好,因此對於 Web 開發領域有一些心得體會。總的來說,我喜歡使用 Go 語言進行 Web 開發,儘管開始一段時間需要去適應它。Go 語言有一些坑,但是正如本篇文 ⌘ [Read more](https://www.readfog.com/a/1679151621068656640) 2022-09-05T15:00:50Z **微服務配置中心, 這個方案 Go 裏用起來不輸 SpringClou**
微服務架構設計模式裏有一條講到,要設計可配置的服務。把服務從單體架構細分成微服務後,所有配置屬性都集中存儲在一個位置,更易於管理。這個集中存儲管理配置的地方,就是配置中心。使用配置中心還有一個好處就是,往往都支持應用配置的熱更新,這樣就不需要像修改本地配置那樣進行發版部署了。但是這麼好的事兒就沒有缺點了嗎?當然有,除非有基礎設施支持,否則它需要額外的人力進行設計和運維。不過好在有各種開源框架比如 ⌘ [Read more](https://www.readfog.com/a/1679151726478856192) 2022-09-05T15:07:59Z **基於 Go 語言開發的監控系統**
01 介紹小米開源的監控系統 open-falcon 和滴滴開源的日誌採集工具 falcon-log-agent 作爲一組黃金搭檔,被互聯網公司廣泛使用。本文介紹怎麼使用這組黃金搭檔監控業務系統的日誌。02 open-falconopen-falcon 使用 Golang 和 Python 開發,其中 Python 主要開發的是 Dashboard。限於篇幅,本文不準備介紹 open-falcon ⌘ [Read more](https://www.readfog.com/a/1679152176420720640) 2022-09-06T03:01:11Z **DNS 做服務發現,是坑嗎 ?**
背景分享遇到過這麼一個問題,有童鞋的 Go 程序用 DNS 解析做服務發現(內網用的 CoreDNS 做的域名解析服務器)。比如,內網有個服務域名,對應 7 個後端節點。爲了做服務發現,故障的剔除等服務,在 Client 端對一個給定的域名調用 Go 標準庫的  Resolver.LookupHost  方法來解析 ip 列表。如果解析得到的 ip 列表有變化,那麼在 Client 內對相應的對後 ⌘ [Read more](https://www.readfog.com/a/1679197047099592704) 2022-09-06T06:59:48Z **Go 中簡單的內存節省技巧**
除非您正在對服務進行原型設計,否則您可能會關心應用程序的內存使用情況。佔用更小的內存,會使基礎設施成本降低,擴展變得更容易。儘管 Go 以不消耗大量內存而聞名,但仍有一些方法可以進一步減少消耗。其中一些需要大量重構,但很多都很容易做到。預先分配切片要理解這種優化,我們必須瞭解切片在 Go 中是如何工作的,爲此我們必須首先了解數組。go.dev 上有一篇非常好的關於這個主題的文章。數組是具有連續內存 ⌘ [Read more](https://www.readfog.com/a/1679212059286409216) 2022-09-06T14:04:24Z **Golang 1-19 原子操作再度升級**
8 月 2 號,Go 1.19 終於發佈,這次的更新包含了對於泛型帶來的諸多問題修復,提升了泛型性能(據官方描述性能優化了 20%),以及內存模型與 C, C++, Java, Rust 的對齊,還有我們今天的主角:sync/atomic 的新類型。感興趣的同學可以看下官方的 release blog[1],release note[2] 以及 下載安裝 [3],體驗一下新版本帶來的特性。今天我們 ⌘ [Read more](https://www.readfog.com/a/1679238773297221632) 2022-09-07T03:14:15Z **「Go 工具箱」一個基於雙向鏈表實現的 LRU 緩存工具**
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的工具是一個實現了固定緩存大小、線程安全的緩存組件,該緩存實現了最近最少使用的策略:golang-lru。實現原理分析:該包是基於內置包 list.List 實現的,list.List 的底層是一個雙向鏈接。並提供了一個列表的大小。當對該列表中的某個元素進行訪問或添加操作時, ⌘ [Read more](https://www.readfog.com/a/1679288465710223360) 2022-09-07T03:13:33Z **從頭開始在 Go 中設計一個無密碼的登錄系統**
無密碼登錄是一種誤導性的說法,因爲在任何認證步驟中都會以這樣或那樣的方式涉及密碼。即使是在生物識別系統中,你的生物識別技術也充當了密碼。無密碼的概念是圍繞着爲用戶創建臨時密碼而展開的。以達到減少攻擊面的目的。請放心,如果密碼每次都改變,那麼攻擊者將不得不獲得用戶的郵箱賬號或手機號來破解系統。本文是系列博客的一部分,我們將從頭開始構建無密碼認證系統的後端和前端。這裏使用的代碼不應該被用作任何項目的種 ⌘ [Read more](https://www.readfog.com/a/1679288421469753344) 2022-09-08T06:50:58Z **Go 語言實現敏感詞檢測(前綴樹)**
一、前言\-\-\-\- 大家都知道遊戲文字、文章等一些風控場景都實現了敏感詞檢測,一些敏感詞會被屏蔽掉或者文章無法發佈。今天我就分享用 Go 實現敏感詞前綴樹來達到文本的敏感詞檢測,讓我們一探究竟!二、敏感詞檢測-------實現敏感詞檢測都很多種方法,例如暴力、正則、前綴樹等。例如一個遊戲的文字交流的場景,敏感詞會被和諧成 ,該如何實現呢?首先我們先準備一些敏感詞如下:sensitiveWords ⌘ [Read more](https://www.readfog.com/a/1679392697262116864) 2022-09-08T11:03:33Z **Go 語言漏洞管理機制**
近年來針對軟件供應鏈的安全問題越來越突出,從之前的語言模塊投毒的,最近 PyPI遠程執行漏洞,還有今年年初的 Java 基礎日誌庫 Log4j 安全漏洞都充分展現了這個問題。爲了應付這個問題,Golang 新推出了漏洞管理支持,用來幫助 Golang 開發人員瞭解已知漏洞和解決供應鏈安全威脅。本文我們就來介紹一下 Golang 漏洞管理機制。概述Go 最新推出了漏洞管理工具來分析代碼庫和發現依賴庫 ⌘ [Read more](https://www.readfog.com/a/1679408588471242752) 2022-09-08T11:02:31Z **一個線程安全的泛型支持 map 庫**
orcaman/concurrent-map[1] 是一個非常高效的線程安全的 map 庫,正如它的文檔中所說的那樣,標準庫sync.Map更適合append-only的場景,或者說少寫大量的讀的場景,如果針對多讀多寫的場景,concurrent-map可能會更有優勢。它是通過分片的方式,將鎖的粒度減少,從而提高性能。今年初的時候,這個庫做了改造,開始支持泛型 [2],但是不幸的是,它只支持 Va ⌘ [Read more](https://www.readfog.com/a/1679408523392421888) 2022-09-09T10:48:36Z **「Go 工具箱」推薦一個實現進度條功能的工具:uiprogress**
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是在終端(terminal)下能夠顯示進度條的工具:uiprogress。先看下使用該包的效果圖:相信大家在 linux 或 mac 終端上都下載過東西,然後會出現下載的進度條。今天我們就給大家分析下實現原理並演示其效果。安裝$ go get -v github.com/g ⌘ [Read more](https://www.readfog.com/a/1679498245568565248) 2022-09-13T02:29:33Z **Go 新漏洞管理工具: govulncheck**
我們很高興地宣佈 Go 對漏洞管理的最新支持,這是我們爲幫助 Go 開發者瞭解可能影響他們的已知漏洞而邁出的第一步。 這篇文章概述了這個項目的當前狀況和後續計劃。概覽------Go 提供的工具可以分析你的代碼庫並展示出已知的漏洞,該工具由 Go 安全團隊設計維護的 Go 漏洞數據庫提供支持。Go 只展示代碼調用函數中的漏洞,從而減少結果中的噪音。Go 漏洞數據庫------------Go 漏 ⌘ [Read more](https://www.readfog.com/a/1679829235558092800) 2022-09-13T03:51:46Z **Go 一個兼具單機和集羣模式的輕量級限流器:throttle**
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。 今天給大家推薦的工具是一個輕量級的限流器,star:1.2k。該工具實現了對資源的訪問速率限制,資源可以是特定的 URL、用戶或者任何自定義的形式。比如針對 HTTP API 接口。該包基於通用信源速率算法(generic cell rate algorithm)實現的。其底層存儲是內 ⌘ [Read more](https://www.readfog.com/a/1679834408199229440) 2022-09-13T03:57:54Z **如何像 gitlab-runner 那樣將 Go 應用安裝爲系統服務**
在《讓 reviewdog 支持 gitlab-push-commit,守住代碼質量下限》1] 一文中,gitlab-runner[2 通過自身提供的 install 命令將自己安裝爲了一個系統服務 (如下面步驟): Create a GitLab CI usersudo useradd --comment 'GitLab Runner' --create-home gitlab-runner - ⌘ [Read more](https://www.readfog.com/a/1679834794323709952) 2022-09-13T03:55:37Z **如何在 Go 中轉換數據類型**
介紹--在 Go 中,數據類型用於對一種特定類型的數據進行分類,確定可以分配給該類型的值以及可以對其執行的操作。在編程時,有時你需要在類型之間轉換值以便以不同的方式操作值。例如,你可能需要將數值與字符串連接起來,或者在初始化爲整數值的數字中表示小數位。用戶生成的數據通常會自動分配爲字符串數據類型,即使它由數字組成;爲了在此輸入中執行數學運算,你必須將字符串轉換爲數字數據類型。由於 Go 是一種靜態 ⌘ [Read more](https://www.readfog.com/a/1679834650080546816) 2022-09-13T04:20:57Z **Go 編程語言與環境:萬字長文覆盤導致 Go 語言成功的那些設計決策**
美國計算機學會通訊 (Communications of the ACM)[1] 期刊 2022 年 5 月第 65 卷第 5 期將發表一篇有關 Go 語言的綜述類 Paper:《Go 編程語言與環境》[2],這類綜述類文章只有資深的 Go 核心團隊的人才 “有資格” 寫,該文的作者列表印證了這一點,他們是 Russ Cox,Robert Griesemer,Rob Pike,Ian Lance ⌘ [Read more](https://www.readfog.com/a/1679836244575621120) 2022-09-14T02:24:22Z **使用 channel 控制併發數量**
協程--goroutine 是輕量級線程,調度由 Go 運行時進行管理的。Go 語言的併發控制主要使用關鍵字 go 開啓協程 goroutine。Go 協程(Goroutine)之間通過信道(channel)進行通信,簡單的說就是多個協程之間通信的管道。信道可以防止多個協程訪問共享內存時發生資源爭搶的問題。語法格式:// 普通函數創建 goroutinego 函數名(參數列表)//匿名函數創建 g ⌘ [Read more](https://www.readfog.com/a/1679919506153115648) 2022-09-15T03:25:05Z **「Go 工具箱」一個將非負整數轉換成唯一、無序 ID 的工具:hashids**
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。 今天給大家推薦的工具是 hashids。該工具可以將一個正整數轉換成長度較短、唯一且不連續的 ID 值。一般適用於生成用戶 ID,但又不想用有規律的 ID 的場景。 原理分析:將長字符串轉換成短字符串的本質是進制轉換。將小進制數往大進制數上轉換就會變短,將大進制數往小進制數上轉換就會 ⌘ [Read more](https://www.readfog.com/a/1680013922894188544) 2022-09-15T13:19:34Z **一行代碼實現一個 RESTful 接口**
背景--基於現在微服務或者服務化的思想,我們大部分的業務邏輯處理函數都是長這樣的:比如 grpc 服務端:func (s Service) GetUserInfo(ctx context.Context, req pb.GetUserInfoReq) (pb.GetUserInfoRsp, error) {    // 業務邏輯    // ...}grpc 客戶端:func (s Service ⌘ [Read more](https://www.readfog.com/a/1680051325424996352) 2022-09-16T06:57:34Z **「Go 工具箱」推薦一個非常簡單的深拷貝工具:deepcopy**
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的工具是 deepcopy,一個可以對指針、接口、切片、結構體、Map 都能進行深拷貝的工具。在 Go 中需要對一個變量進行拷貝時分淺拷貝和深拷貝。淺拷貝就是拷貝後就是無論改變新值還是原值都對對另一個產生影響,比如切片。而深拷貝則是將目標值完全拷貝一份,消除這種影響。實現原理 ⌘ [Read more](https://www.readfog.com/a/1680117888074223616) 2022-09-19T08:46:41Z **looplab-fsm 源碼閱讀**
github.com/looplab/fsm 實現了一個有限狀態機,下面研究下它的源碼,除了測試文件外,它有下面幾個文件:errors.go //定義了錯誤fsm.go //定義了狀態機的核心邏輯event.go //定義了事件結構體graphvizvisualizer.go //生成graphviz格式的文件mermaidvisualizer.go // 生成mer ⌘ [Read more](https://www.readfog.com/a/1680396543978475520) 2022-09-19T08:56:13Z **「Go 工具箱」推薦一個變量調試神器:go-spew**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。 今天給大家推薦的是一個可以將變量以一種非常友好的方式輸出其完整的數據結構信息的工具:go-spew。 該包經過了全面的測試,測試覆蓋率爲 100%。支持各種自定義配置,非常方便,可以有效提升我們日常開發的效率。下面是該包的基礎檔 ⌘ [Read more](https://www.readfog.com/a/1680397144654188544) 2022-09-19T09:18:13Z **如何用運算符在 Go 中做數學計算**
介紹------數字在編程中很常見。它們被用來表示一些東西,如:屏幕大小的尺寸、地理位置、金錢和積分、視頻中經過的時間、遊戲頭像的位置、通過分配數字代碼表示的顏色等等。在編程中進行數學運算是一項重要的技能,因爲你會經常與數字打交道。儘管對數學的理解肯定能幫助你成爲一個更好的程序員,但它不是一個先決條件。如果你沒有數學背景,試着把數學看作是完成你想實現的目標的工具,並作爲提高你的邏輯思維能力的一種 ⌘ [Read more](https://www.readfog.com/a/1680398528088739840) 2022-09-20T02:36:27Z **Go 語言爲什麼建議定義零值可用的結構體?**
大家好,我是 frank。 歡迎大家關注「Golang 語言開發棧」公衆號。 01 介紹 在 Go 語言中,通過聲明或者通過調用 new 爲變量分配存儲空間,或者通過複合字面量或調用 make 創建新值時。如果未提供顯式初始化,則會爲變量或值指定默認值,此類變量或值的每個元素都設置爲其類型的零值。02 Golang 類型的零值 在 Go 語言中,原生類型都有默認值,即類型的零值。布爾型 ⌘ [Read more](https://www.readfog.com/a/1680463848070549504) 2022-09-20T15:05:10Z **解析 Golang 定時任務庫 gron 設計和原理**
從 cron 說起---------在 Unix-like 操作系統中,有一個大家都很熟悉的 cli 工具,它能夠來處理定時任務,週期性任務,這就是: cron。 你只需要簡單的語法控制就能實現任意【定時】的語義。用法上可以參考一下這個 Crontab Guru Editor[1],做的非常精巧。簡單說,每一個位都代表了一個時間維度, 代表全集,所以,上面的語義是:在每天早上的 4 點 05 分觸 ⌘ [Read more](https://www.readfog.com/a/1680510953955889152) 2022-09-21T04:16:11Z **如何在開發和生產環境中使用 Docker 容器化 Golang 應用**
Photo by Ian Taylor on Unsplash.你是否想寫一個使用 Docker 容器化的 Golang 應用程序?本文的目的就是幫助你快速將你的 Golang 應用程序容器化,以用於開發(帶熱加載)和生產目的。開始之前----請先安裝 Docker Desktop ,然後再繼續。安裝後,啓動桌面應用程序,如果它運行成功,你就可以開始了。此外,我假設你有一個 $GOPATH 目錄 ⌘ [Read more](https://www.readfog.com/a/1680560720286158848) 2022-09-21T04:21:45Z **Go 學設計模式 -- 原型模式的考查點和使用推薦**
前言--如果一個類的有非常多的屬性,層級還很深。每次構造起來,不管是直接構造還是用建造者模式,都要對太多屬性進行復制,那麼有沒有一種好的方式讓我們創建太的時候使用體驗更好一點呢? 今天的文章裏就給大家介紹一種設計模式,來解決這個問題。這篇內容要說的是創造型設計模式裏的原型模式,如果寫過點 JS 代碼的話,大家可能聽說過原型鏈這麼個東西,原型模式在 JavaScript 實現裏確實廣泛應用,它那個面 ⌘ [Read more](https://www.readfog.com/a/1680561070164512768) 2022-09-21T04:20:00Z **使用 viper 實現 yaml 配置文件的合併**
作爲小廠,我們的基礎設施還不夠完備,項目經理中秋節通知我們的系統近期要上 second-to-last stage 環境和生產環境,於是從運維人員部署效率方面考量,我們緊急開發了一個一鍵安裝腳本生成工具,這樣運維人員便可以利用該工具結合實際目標環境生成一鍵安裝腳本。這個工具的原理十分簡單,如下示意圖所示:從上圖可以知道,我們的工具是基於模板定製最終的配置與安裝腳本的,其中:templates/co ⌘ [Read more](https://www.readfog.com/a/1680560959635165184) 2022-09-22T03:16:16Z **深度解密 Go 的字符串**
Go 字符串實現原理Go 的字符串有個特性,不管長度是多少,大小都是固定的 16 字節。package mainimport (    "fmt"    "unsafe")func main() {    fmt.Println(        unsafe.Sizeof("komeiji satori"),    )  // 16    fmt.Println(        unsafe.Si ⌘ [Read more](https://www.readfog.com/a/1680647547779125248) 2022-09-23T03:58:35Z **好用的 map-struct 轉換庫 mergo**
1\. 前言---------開發時,經常會碰到要把 map 轉成 struct,或者把 struct 轉成 map,方便數據處理。這個時候我們可以用到 mergo 。它非常簡單、好用,輔助我們更高效的開發。2. 特性---------mergo 有很多特性:支持 struct 轉成 map map 轉成 struct 支持各種選項,比如覆蓋寫等 … …. 更多功能特性請查看 ⌘ [Read more](https://www.readfog.com/a/1680740806865031168) 2022-09-26T04:09:30Z **「每週譯 Go」瞭解 Go 中的布爾邏輯**
布爾數據類型(bool)可以是兩個值中的一個,即真或假。布爾型數據在編程中被用來進行比較和控制程序的流程。 Boolean 在 Go 中的數據類型是bool,全部小寫。值 true 和 false 總是分別用小寫的 t 和 f,因爲它們是 Go 中的特殊值。本教程將涵蓋你需要了解 bool 數據類型如何工作的基礎知識,包括布爾比較、邏輯運算符和真值表。比較運算符-----在編程中,比較運算符被用 ⌘ [Read more](https://www.readfog.com/a/1681013284384378880) 2022-09-26T04:11:40Z **Go 語言之道 [譯]**
近期閱讀了 John Arundel[1] 的文章《The Tao of Go》[2],看完後我都有心去閱讀一遍《道德經》了:)。作者將 Go 語言設計哲學與慣例 [3] 與 “道” 學三寶有機的聯繫到一起,給了我不小的啓發。這裏譯成中文,供大家參考。 你可以讓水牛去任何地方,只要它們想去 - 傑拉爾德・溫伯格 《諮詢的奧祕》4“道” 是指事物的內在本質或自然趨勢。例如,水向低處流:這就是水的 ⌘ [Read more](https://www.readfog.com/a/1681013420778950656) 2022-09-26T10:02:38Z **「Go 工具箱」一個對語義化版本進行解析、比較的庫:go-version**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。今天給大家推薦的是一個版本比較工具。該工具基於語義化標準的版本號進行比較、約束以及校驗。以下是 go-version 的基本情況:table interlaced="enabled"tbodytr data-darkmode-bgco ⌘ [Read more](https://www.readfog.com/a/1681035502045728768) 2022-09-26T10:09:11Z **Go 語言爲什麼建議 append 追加新元素使用原切片變量接收返回值?**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在 Go 語言中,切片類型比較常用,將新元素追加到切片也比較常見,因此 Go 語言提供一個內置函數 append,該函數可以非常方便實現此功能。雖然 Go 語言內置函數 append 使用非常方 ⌘ [Read more](https://www.readfog.com/a/1681035913628585984) 2022-09-26T10:07:22Z **go 語言 nil 避坑指南**
引言--筆試題遇到 var x string = nil ,問這個定義是否正確?這裏給出答案:cannot use nil as string value in variable declaration。也就是說,string類型和nil八竿子打不着,要想判斷字符串是否爲空,可以使用str == ""或者len(str) == 0。接下來,順便總結一下 nil 的使用nilnil 是 go 語言中 ⌘ [Read more](https://www.readfog.com/a/1681035799555051520) 2022-09-27T02:26:59Z **gRPC 錯誤處理**
gRPC 具有很好的錯誤處理機制。在前面的代碼中,我們返回的錯誤和 Go 標準庫中的代碼一樣。儘管這段代碼可以處理不同計算機之間調用,但由於 gRPC 抽象了網絡細節,讓你對底層細節所知不多。默認情況下,您的錯誤只有一個字符串描述,但是你可能希望錯誤能包括更多的信息,如狀態碼或一些其他任意數據。Go 的 gRPC 實現中有一個非常實用的 status 包,你可以用來創建帶狀態碼的錯誤或者添加任何其 ⌘ [Read more](https://www.readfog.com/a/1681097432008593408) 2022-09-27T09:12:00Z **Go 開發人員最佳 VSCode 插件列表**
大家好,我是程序員幽鬼。VSCode 目前是最流行的編輯器,沒有之一。它的插件也很多,本文介紹 Go 開發人員的插件列表。當我還是個孩子的時候,我決定只使用開源工具。當時,這是一個艱難的決定,因爲許多開源工具都沒有良好的性能。圖片來自:https://triplebyte.com/blog/editor-report-the-rise-of-visual-studio-code正如斯托曼所說,“珍 ⌘ [Read more](https://www.readfog.com/a/1681122912922341376) 2022-09-27T09:28:20Z **Go 語言實戰稀疏文件解壓,4 倍提升,多個技巧!!**
前段時間,使用 Golang 寫了個解壓 tar 文件的小工具,速度比 linux 自帶的 tar 要快很多(4、5 倍差距),而且同樣支持稀疏文件,具體關於稀疏文件的解釋,可以參考我這篇文章 Golang 和稀疏文件。前方高能,稍微有點枯燥,但能學到東西:tar 標準包不支持稀疏文件,自己如何支持 如何調用私有方法 如何提升解壓性能 golang tar 解壓--------- ⌘ [Read more](https://www.readfog.com/a/1681123940194422784) 2022-09-28T02:37:51Z **我認爲 Go 的成功歸功於這 5 個方面**
大家好,我是煎魚。在國外的播客節目 Go Time #100 中,Rob Pike 和 Robert Griesemer(Go 的兩位創始人)和主持人 Jerod Santo 討論了 Go 語言的成功緣由和一些思考。如果你想創造一門成功的編程語言,向已經做到的人學習是非常有價值的。歡迎對 Go 感興趣的小夥伴一起圍觀!說明-----Rob Pike(下稱:Rob)將 Go 的成功歸爲了 5 個方面 ⌘ [Read more](https://www.readfog.com/a/1681188712509181952) 2022-09-28T02:49:01Z **在 Go 裏用 CGO?這 7 個問題你要關注!**
今天給大家分享的是 Go 諺語中的 Cgo is not Go[1],原文章同名,略有修改,原文作者是 @Dave Cheney。以下的 “我” 均指代原作者。借用 JWZ 的一句話:有些人在面對一個問題時,認爲 "我知道,我會使用 cgo(來解決這個問題)"。在使用 cgo 後,他們就會遇到兩個新問題。Cgo 是什麼-------Cgo 是一項了不起的技術,它允許 Go 程序與 C 語言庫相互操 ⌘ [Read more](https://www.readfog.com/a/1681189414463705088) 2022-09-28T08:59:16Z **解析 Golang 經典校驗庫 validator 用法**
https://juejin.cn/post/7135803728916905997開篇--今天繼續我們的 Golang 經典開源庫學習之旅,這篇文章的主角是 validator,Golang 中經典的校驗庫,它可以讓開發者可以很便捷地通過 tag 來控制對結構體字段的校驗,使用面非常廣泛。validator--------- Package validator implements val ⌘ [Read more](https://www.readfog.com/a/1681212709157310464) 2022-09-28T09:08:29Z **Go 的 noCopy 是什麼機制?**
你是否遇到過 assignment copies lock 的錯誤?當我們用 go vet 檢查靜態問題的時候,你是否遇到 noCopy 相關的錯誤。最典型的就是 lock 的變量,測試代碼:func main() {    var mu sync.Mutex    var i int    // mu 重新拷貝出來一個    m := mu     m.Lock()    i += 1    m ⌘ [Read more](https://www.readfog.com/a/1681213288306806784) 2022-09-30T10:25:33Z **Go CPU profiler 內幕**
Go 是那種自帶 profiler (分析器) 的語言之一。它的運行時包含強大的自成一派的各種 profiler。其它語言,比如 Ruby、Python 和 Node.js, 它們也包含 profiler 或者一些用來編寫 profiler 的 API,但是與 Go 的開箱即用的 profiler 相比,它們提供的 profiler 功能有限。如果你想多瞭解 Go 提供的這些可觀察工具的情況,我強 ⌘ [Read more](https://www.readfog.com/a/1681399331419164672) 2022-10-08T03:08:22Z **使用 go 做一個 https 證書時間檢測工具**
轉自: https://juejin.cn/post/7131378441428926501各位運維同仁肯定都多多少少面臨過,爲了節省不必要的開支,很多不那麼重要的域名https證書大多數都是申請的免費的單域名證書,這造成檢測非常不方便,雖然運營商ssl證書到期前會預警,但是爲了避免該類問題,我們可以編寫一個web用於檢測ssl證書檢測工具。搭建 demo我們還是使用我們編寫的Sampl ⌘ [Read more](https://www.readfog.com/a/1682096601297948672) 2022-10-08T14:06:37Z **Go 語言中常見 100 問題 - 項目結構混亂**
項目結構混亂創建一個好的 Go 項目結構並不是一件容易的事情,由於 Go 語言在設計包和模塊方面提供了很大的自由度,因此在這方面沒有通用的最佳實踐。本文將首先討論創建項目的常用組織結構,然後討論一些最佳實踐,給出改進項目組織方式的方法。項目結構Go 語言維護者對構建 Go 項目結構沒有嚴格的約定,在 github 上有一個稱爲標準 Go 項目結構的模板(https://github.com/gol ⌘ [Read more](https://www.readfog.com/a/1682138014924509184) 2022-10-08T14:06:01Z **如何在 Golang 中編寫斷路器(circuit breaker-**
大家好,我是程序員幽鬼。在這篇文章中,我想談談一個基於流行的開源項目 hystrix 的 circuit breaker (斷路器)模式(實際上,我會看看 golang 版本的 hystrix-go[1],而不是用 Java 編寫的原始版本 [2])。在本文的第一部分中,我將對 circuit breaker 進行一般性介紹,讓你瞭解它是什麼以及它爲什麼重要。此外,讓我們回顧一下 hystrix- ⌘ [Read more](https://www.readfog.com/a/1682137977664409600) 2022-10-08T14:14:53Z **Go:符號表是什麼?如何使用?**
本文基於 Go 1.13 ,原文及譯者信息在文末。符號表是由編譯器生成和維護的,保存了與程序相關的信息,如函數和全局變量。理解符號表能幫助我們更好地與之交互和利用它。符號表---Go 編譯的所有二進制文件默認內嵌了符號表。我們來舉一個例子並研究它。下面是代碼:var AppVersion stringfunc main() { fmt.Println(Version: +AppVersion)}可 ⌘ [Read more](https://www.readfog.com/a/1682138535280349184) 2022-10-08T14:10:38Z **Golang 基於 flag 庫實現一個命令行工具**
轉自: https://juejin.cn/post/7137669791879266335Golang 標準庫中的 flag 庫提供瞭解析命令行選項的能力,我們可以基於此來開發命令行工具。假設我們想做一個命令行工具,我們通過參數提供【城市】,它自動能夠返回當前這個【城市】的天氣狀況。這樣一個簡單的需求,今天我們就來試一下,看怎樣實現。flag 庫------ Package flag ⌘ [Read more](https://www.readfog.com/a/1682138267570507776) 2022-10-09T03:00:48Z **Go 語言中常見 100 問題 - 創建通用工具包**
創建 util 包不是一種好的做法本文將討論 Go 語言中一種常見的不好的實踐:創建 utils、common 和 base 等共享包。首先分析這種做法存在的問題,然後討論如何改進。下面是一個受 Go 官方博客啓發構造的例子,實現一個集合數據結構。在 Go 語言中完成該功能的慣用方法是通過 map[K]struct{} 類型來處理,K 是 map 中允許的任何類型作爲鍵,而值是 struct{} ⌘ [Read more](https://www.readfog.com/a/1682186722862010368) 2022-10-09T13:30:51Z **Go 的 IO 流怎麼併發?小技巧分享**
今天聊一個存儲的實現細節,數據副本的併發寫入。存儲的高可靠性和高可用,必須依賴於數據的冗餘機制。比如 3 副本就是把用戶數據複製成 3 份。然後把 3 份數據分發到不同的地方。這個寫下去的動作是有講究的,因爲肯定不希望時延線性增加,你肯定希望的是雖然多寫 2 份數據,但還只耗費 1 份時間。換句話說,原則上數據雖然變多了,但是時間開銷不能增加。那就只能併發寫入嘍!那這個動作怎麼實現呢?帶大家思考幾 ⌘ [Read more](https://www.readfog.com/a/1682226362330484736) 2022-10-10T03:57:58Z **「Go 工具箱」推薦一個簡單、實用的圖像處理工具:imaging**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是一個強大、實用、簡單的圖像處理工具:imaging。以下是該工具的基本檔案:table width="505" interlaced="enabled"tbodytr data-darkmode-bgcolor-16653742333917="rgb(28, 28, 28 ⌘ [Read more](https://www.readfog.com/a/1682280915908268032) 2022-10-10T04:09:23Z **TLS 服務端認證**
使用 CFSSL 生成自己的 CA 正式在修改服務端代碼之前,我們先創建幾個證書。我們可以通過第三方認證機構獲取證書,但那需要花錢而且麻煩。對於內部服務的話,沒必要通過第三方機構。受信任的證書不一定來自於 Comodo 或 Let 's Encrypt 或任何其他權威 CA 機構,它們可以來自於自己生成的 CA。只要有合適的工具,這是免費也容易做到的。CloudFlare 公司 (一家美國雲計算公 ⌘ [Read more](https://www.readfog.com/a/1682281634024493056) 2022-10-10T10:51:34Z **理解 Go 中的數組和切片**
介紹--在 Go 中,數組和切片是數據結構,由元素的有序序列組成。當你想處理許多相關的值時,這些數據集合是很好的選擇。它們可以讓你把相同類型的數據放在一起,降低代碼量,並同時對多個值執行相同的方法和操作。雖然 Go 中的數組和切片都是元素的有序序列,但兩者之間有很大的區別。Go 中的數組是一個數據結構,由一個有序的元素序列組成,其容量在創建時已經定義。一旦數組分配了它的大小,就不能再改變它的大小。 ⌘ [Read more](https://www.readfog.com/a/1682306937862066176) 2022-10-10T11:01:49Z **Go:Map 和 內存泄露**
大家好,我是程序員幽鬼。分享一篇關於 map 和 “內存泄露” 的文章。摘要:map 總是可以在內存中增長;它從不收縮。因此,如果它導致一些內存問題,你可以嘗試不同的選項,例如強制 Go 重新創建 map 或使用指針。在 Go 中使用 map 時,我們需要了解 map 如何增長和收縮的一些重要特徵。讓我們深入研究一下,以防止可能導致內存泄漏的問題。首先,要查看此問題的具體示例,讓我們設計一個場景, ⌘ [Read more](https://www.readfog.com/a/1682307582422781952) 2022-10-11T02:54:17Z **實時可視化 Go Runtime 指標,這個 Go 庫超讚**
前言--小土之前分享過一篇如何監控 Go Runtime 的文章,主要是通過 Grafana,Graphite,Statsd 等組件來採用 UDP 協議採集 metrics 上報到 Grafana 來進行一系列的展示。相對比較繁瑣。今天小土帶來一個 Go 庫 statsviz-https://github.com/arl/statsviz 可以一鍵集成到你的 HTTP 服務中,並且在瀏覽器中可以實 ⌘ [Read more](https://www.readfog.com/a/1682367506156720128) 2022-10-11T02:55:02Z **如何監控 Go Runtime**
文章來自於 http://blog.helongfei.com/2019/%E7%9B%91%E6%8E%A7-go-runtime/,也可以閱讀原文閱讀。Go 通常作爲守護進程存在,若我們不做任何監控,放任其「自由」的使用資源,那有可能會發現意外情況,比如「Goroutine 泄露」。那我們應該如何監控,又要監控哪些指標呢?監控指標監控的核心是監控指標,「有用」的指標纔是有意義,那 Go 有 ⌘ [Read more](https://www.readfog.com/a/1682367554026311680) 2022-10-12T11:27:50Z **深究 Go CPU profiler**
在 profiling 方面,Go 是獨一無二的。在 runtime 裏面它包含強大的,有自主意識的 profilers。其他編程語言像 Ruby,Python,或者 Node.js,包含了 profilers 或者一些 APIs 接口用來寫 profiler。但與 Go 提供的開箱即用的服務相比,它們的範圍還是有限的。如果你想學習更多關於 Go 提供的可觀測性工具,我強烈建議 Felix Gei ⌘ [Read more](https://www.readfog.com/a/1682490413465833472) 2022-10-13T03:54:36Z **用 Go 寫的文件傳輸工具 croc 瞭解一下**
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。土撥鼠最近換了 M1 的電腦,由於 MAC 的隔空發送一直髮現不了對方,就想起 17 年用過的一個用 Go 寫的傳輸工具,一直有點印象,忘記叫什麼名了,在 GitHub 上 star 列表終於才搜到 croc[1]。這下趕緊順手給他歸了一下 repo 的類別。下來土撥鼠簡單介紹一下這個庫。croc有鱷 ⌘ [Read more](https://www.readfog.com/a/1682552495042301952) 2022-10-13T14:43:28Z **GORM 強大的代碼生成工具 — gorm-gen**
GORM 的那些困擾----------GORM 進入到 2.0 時代之後解決了很多 jinzhu/gorm 時代的問題,整體的擴展性以及功能也更強大。但總有一些繞不開的問題困擾着我們。SQL 注入Object Relational Mapping 的定位就是幫助開發者減輕心智負擔,你不用再去思考業務 object 和 數據表 relation 之間的對應,ORM 框架來幫你完成。我們只需要簡單的 ⌘ [Read more](https://www.readfog.com/a/1682593318097227776) 2022-10-14T07:56:08Z **Go 語言中常見問題 - 缺少代碼文檔**
文檔(代碼註釋)是編碼的一個重要方面,它可以降低客戶端使用 API 的複雜度,也有助於項目維護。在 Go 語言中,我們應該遵循一些規則使得我們的代碼更地道。下面一起來看看這些規則。每個可導出的元素必須添加文檔說明,無論是結構體、接口、函數還是其他元素。如果它被導出,則必須有文檔說明。通用的文檔說明是添加註釋,註釋前以元素名稱開始,像下面這樣。// Customer is a customer re ⌘ [Read more](https://www.readfog.com/a/1682658287781253120) 2022-10-17T04:13:35Z **Go 語言一次性定時器使用方式和實現原理**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在 Go 語言標準庫 time 包中的 Timer 類型,它是表示單一事件的計時器,也就是說它是一次性定時器。在 Go 語言項目開發中,定時器使用廣泛,本文我們介紹 Go 語言中怎麼使用 Tim ⌘ [Read more](https://www.readfog.com/a/1682916077118525440) 2022-10-19T03:12:42Z **Go 程序太大了,能要個延遲初始化不?**
在公司的不斷髮展中,一開始大多是大單體,改造慢了,一個倉庫會有使用十幾年的情況,倉庫的規模基本是不斷增大的過程。影響之一就是會應用程序打包後的體積越來越大,不知道被用哪裏去了... 今天要探討的提案《proposal: language: lazy init imports to possibly import without side effects[1]》,就與此有關。提案--背景我們來觀察一 ⌘ [Read more](https://www.readfog.com/a/1683093440644091904) 2022-10-19T13:48:06Z **還咋優化?我是說 Go 程序**
Go 語言是一個極容易上手的語言,而且 Go 程序的優化套路基本上被大家莫得清清楚楚的,如果你有心,可以在互聯網上搜出很多 Go 程序優化的技巧,有些文章可能只介紹了幾個優化點,有些文章從 CPU 的架構到 Slice 預分配,再到通過 pprof 找性能的瓶頸點等等全面介紹 Go 程序的優化,所以說可見的手段基本上被大家摸得門清,最近老貘出了一道題,如下所示,可以看到大家對 Go 語言的優化已經 ⌘ [Read more](https://www.readfog.com/a/1683133416517767168) 2022-10-20T03:21:35Z **Go Gin 框架請求自動驗證和數據綁定,看完這篇就會用了**
之前做項目基本上公司是用 gRPC 和 echo 這兩個框架的組合,後來 Gin 框架在 Go 圈越來越流行,陸續我在公司接觸到的項目也開始有人用 Gin 框架開發了。因爲我也是偶爾開發,像 Gin 框架裏邊參數的模型驗證和綁定這些沒有系統去學習,都是粘貼一下其他人的代碼,改成我要的參數和模型,這裏說的模型就是保存請求數據的 Struct。慢慢我發現每個人寫的風格都不一樣,有直接一個個接收參數再賦 ⌘ [Read more](https://www.readfog.com/a/1683184596830752768) 2022-10-20T13:25:52Z **在 Go 中處理錯誤**
健壯的代碼需要對用戶的不正確輸入、網絡連接錯誤和磁盤錯誤等意外情況做出正確的反應。錯誤處理是識別程序處於異常狀態並且採取措施去記錄供後期調試診斷信息的過程。相比於其他編程語言, 要求開發者使用專門的語法去處理錯誤, 在 Go 中將錯誤作爲 error(Go 中的一個接口類型) 類型的值, 並且和其他類型的值一樣作爲函數返回值的一部分返回。要處理 Go 中的錯誤, 我們必須檢查函數返回值中是否包含了 ⌘ [Read more](https://www.readfog.com/a/1683222614595702784) 2022-10-20T13:47:17Z **用 Go interface{} 等於什麼也沒說**
大家好,我是煎魚。如果說在 Go 裏要有一句與 interface{} 相關,你會想到什麼?是萬物皆要定義 interface,否則沒法抽象?Go 諺語中認可的是:"interface{} says nothing",也就是 interface{} 什麼也沒說。這指的又什麼,太黑話了吧...今天就煎魚和大家一起學習。接口類型無自描述--------interface{} 的第一種用法,那就是變量的 ⌘ [Read more](https://www.readfog.com/a/1683223962963775488) 2022-10-21T03:14:49Z **一文搞懂 Go 內聯優化**
移動互聯網時代,直面 C 端用戶的業務系統規模一般都很龐大,系統消耗的機器資源也很可觀,系統使用的 CPU 核數、內存都是在消耗公司的真金白銀。在服務水平不下降的前提下儘量降低單服務實例的資源消耗,即我們俗稱的 “少喫草多產奶”,一直是各個公司經營人員的目標,有些公司每降低 1% 的 CPU 核數使用,每年都能節省幾十萬的開銷。在編程語言選擇不變的情況下,要想持續降低服務資源消耗,一方面要靠開發人 ⌘ [Read more](https://www.readfog.com/a/1683274767619166208) 2022-10-21T03:48:48Z **一個基於 Golang 開發的優雅的開源家庭雲系統**
CasaOS 是一個基於 Golang 的簡單、易用、優雅的開源家庭雲系統。仔細想想我們的數據、智能設備和數字資產的控制權現在都在在一些大公司手中?你的相冊保存在他們的雲服務中嗎? 你的恆溫器、顯示器、燈具需要通過他們的雲服務來使用嗎? 你的個人文件、備忘錄、聯繫人、密碼等是否存放在他們的雲存儲服務中? 當他們決定改變價格、審查內容、甚至停止服務時,你必須接受嗎? 這聽起來 ⌘ [Read more](https://www.readfog.com/a/1683276905896316928) 2022-10-24T03:11:26Z **Go 語言 errgroup 庫的使用方式和實現原理**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01  介紹在 Go 語言中,我們可以使用 errgroup 庫處理 goroutine 中的錯誤。errgroup 庫最近更新了,新增支持限制併發數量的功能。本文我們介紹 errgroup 庫的使用方式 ⌘ [Read more](https://www.readfog.com/a/1683546346520416256) 2022-10-24T03:17:15Z **通過一個例子讓你徹底掌握 Go 工作區模式**
大家好,我是 polarisxu。早在 Go1.18 快要發佈時,我就試用了工作區(workspace)模式,並寫了一篇介紹文章:Go1.18 快訊:Module 工作區模式。然而,Go1.18 正式發佈後,工作區模式有點變化,導致那篇文章的部分內容不試用了,於是今天重新補一篇,因爲工作區模式真的很有用。工作區模式(Workspace mode),可不是之前 GOPATH 時代的 Workspac ⌘ [Read more](https://www.readfog.com/a/1683546711817031680) 2022-10-24T03:39:23Z **使用 Golang 創建和讀取 Excel 文件**
轉自: https://juejin.cn/post/7117578224854368263摘要本文提出一種使用 Golang 進行 Excel 文件創建和讀取的方案。首先對問題進行分析,引出方案的基本架構;然後分章節描述了 Excelize 基礎庫的基本用法,以及 Excel 數據在 Golang 中的表示和解析方式,並進一步提出了應對大規模數據寫入場景的優化方法;最後,指出了一些可能 ⌘ [Read more](https://www.readfog.com/a/1683548104810401792) 2022-10-24T03:37:23Z **一文入門 Go 靜態單賦值(SSA)**
在上一篇文章《通過實例理解 Go 內聯優化》[1] 中,我們探討了 Go 編譯器在編譯中端進行的內聯優化。內聯優化基於 IR 中間表示進行,不過 Go 編譯過程不止有一種 IR 表示,這點和龍書《編譯原理 (第二版)》[2] 的在第六章 “中間代碼生成” 一開始處的講解是一致的,即在將給定源語言的一個程序翻譯成特定的目標機器代碼的過程中,一個編譯器可能構造出一系列中間表示(IR),如下圖:高層中間 ⌘ [Read more](https://www.readfog.com/a/1683547978648883200) 2022-10-24T08:22:01Z **go const 常量幾種好習慣用法**
一、const 語法介紹------------常量是一個簡單值的標識符,在程序運行時,不會被修改的量。 常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和複數)和字符串型。 常量的定義格式:const identifier [type] = value你可以省略類型說明符 [type],因爲編譯器可以根據變量的值來推斷其類型。顯式類型定義:const b string = "abc"隱 ⌘ [Read more](https://www.readfog.com/a/1683565886521315328) 2022-10-25T06:27:21Z **再探 Golang 內聯優化**
轉自: https://juejin.cn/post/7128243201936687117開篇--上一篇文章初探 Golang 內聯 中我們瞭解了內聯的原理,規則。其實 Golang 標準庫裏,以 sync 包爲代表,其實針對鎖的實現,進行了專門的內聯優化。今天我們來實戰驗證一下。感興趣的同學建議先看下 Mutex 和 RWMutex 的源碼,旗幟鮮明地把 fast 和 slow 拆開 ⌘ [Read more](https://www.readfog.com/a/1683649269601505280) 2022-10-25T06:31:43Z **Go 標準庫:context 詳解**
最近學習 go 有一段時間了,在網上一直看到別人推薦,學 go 可以學習裏面的 context 源碼,短小精悍。看了下確實有所收穫,本文是基於我最近對 context 源碼學習的一些心得積累,望大家不吝賜教。 一、爲什麼使用 Context(一)go 的扛把子----------要論 go 最津津樂道的功能莫過於 go 強大而簡潔的併發能力。func main(){ go func(){ ⌘ [Read more](https://www.readfog.com/a/1683649544171130880) 2022-10-25T06:28:34Z **手擼源碼系列 - cache2go**
你好,我是小四,你情商高也可以叫我四哥。碰到很多同學問我,平時疲於寫各種業務代碼,如何才能提高編程能力?我的辦法是多閱讀優秀的代碼,只有見過更好的,我們才能知道如何編寫好的代碼、提高編程能力。就好比如果學武功,你肯定要找一個武林高手作師傅。進入今天的正題。前一篇文章,我們分析了 go-cache 庫,今天再來看一個緩存庫 -- cache2go。網上也有很多文章分析了這個庫,閱讀過源碼的同學都是這 ⌘ [Read more](https://www.readfog.com/a/1683649345680936960) 2022-10-26T03:51:50Z **Go 標準庫依賴的那些 modules**
對於程序員來說,編寫的代碼依賴標準庫是 “天經地義” 的事情。標準庫在程序員眼中就是高質量的代名詞,也是最值得信賴的非自己所寫的代碼,當然更是代碼包依賴關係鏈條上的最後一環,即所有直接或間接依賴的第三方 module 最終都會依賴標準庫。前兩天組內學習 rust[1] 的小夥伴說 rust 的標準庫還依賴第三方庫 (注:我對 rust 瞭解不深,尚未證實),這引發了我的一個疑問: Go 標準庫是否 ⌘ [Read more](https://www.readfog.com/a/1683730081705463808) 2022-10-26T03:51:05Z **探究 Go database-sql 包的設計模式**
使用 Go 中的 SQL database 是容易的,只需下列這三步:// 步驟 1:導入主要的 SQL 包import "database/sql"// 步驟 2:導入一個驅動包來明確要使用的 SQL 數據庫import  "github.com/mattn/go-sqlite3"// 步驟 3:用一個註冊好的驅動名稱來打開一個數據庫func main() {  // ...  db, err ⌘ [Read more](https://www.readfog.com/a/1683730034467115008) 2022-10-26T15:57:23Z **Go 的 json 省略符 omitempty 和 - 兩種方式詳解**
一、介紹----官方文檔 https://pkg.go.dev/encoding/json 有介紹omitempty 如果字段的值爲空值(定義爲 false、0、nil 指針、nil 接口值以及任何空數組、切片、映射或字符串),該選項在編碼期間忽略該字段 "-" 標籤在編碼和解碼時總是省略字段 二、omitempty 空值省略----------------2.1 json 在結構體重 ⌘ [Read more](https://www.readfog.com/a/1683775729412706304) 2022-10-27T02:57:56Z **Go 的方法接收者:值接收者與指針接收者**
最近在 review 一些代碼中,發現經常某個類型定義的方法,其接收者既有值類型,又有指針類型,然後 Goland 就有提示: Struct Person has methods on both value and pointer receivers. Such usage is not recommended by the Go Documentation.一般來講,這個提示對代碼的運行並不會 ⌘ [Read more](https://www.readfog.com/a/1683817288167428096) 2022-10-27T02:55:11Z **如何使用 Docker 創建一個 Go 私有模塊**
介紹------自從 Go 1.11 引入模塊後,Go 應用的依賴管理有了極大地提升。我們可以看到,使用 GOPROXY 能非常簡單地拉取一個模塊,更好地支持請求校驗和流水線式的依賴版本等等。但如果你想要創建自己的模塊,要怎麼開始開始呢?好消息是,相對而言,公開的包與私有的相比,並沒有太多的難度,反之亦然。但它們有一點 不同。 👉 注意:: 在本文中,Go 包和 Go 模塊的含義是相同的。不過, ⌘ [Read more](https://www.readfog.com/a/1683817114676334592) 2022-10-27T06:27:53Z **Go 中正確使用依賴注入**
轉自: https://juejin.cn/post/7130001318046859272依賴注入----依賴注入可以降低代碼的耦合度。某功能依賴另一個實現,但是與該實現無任何責任。它只接收該實現並使用該實現,可以通過依賴注入方式進行解耦。比如以下例子,UserService 依賴很多模塊。Service 依賴很多模塊,我們可以將這部分內容都設置到 UserService 中,但這樣耦 ⌘ [Read more](https://www.readfog.com/a/1683830496414502912) 2022-10-27T06:41:26Z **Go 語言 CGO 用戶深度定製 SQLite 代碼**
本文是 BRUNO CALZA 記錄的關於如何改變 SQLite 源代碼,使記錄行更新時可用於 Go 的更新鉤子函數的過程。原文通過深度定製 C 語言的 API 函數達成目的,這幾乎是所有 CGO 深度用戶必然經歷的過程(關於 CGO 的基本用法可以參考譯者的《Go 高級編程》第 2 章),是一個非常有借鑑意義的技術文章。作者:BRUNO CALZA 譯者:柴樹杉,凹語言 作者、Go 語言貢 ⌘ [Read more](https://www.readfog.com/a/1683831348965511168) 2022-10-28T04:12:23Z **推薦一個 Go 語言開發的簡易版 Redis**
你,我是小金!今天給大家推薦一個我最近正在學習的 Go 開源項目,一個使用 Go 語言實現的簡易版 Redis —— Godis。目前,Godis 這個項目在 Github 上收穫了 2.3k star。麻雀雖小,五臟俱全!目前這個項目已經支持下面這些功能:支持 string, list, hash, set, sorted set, bitmap 數據結構 自動過期功能 (TTL) ⌘ [Read more](https://www.readfog.com/a/1683912569050468352) 2022-10-31T02:59:40Z **go 語言 csrf 庫的使用方式和實現原理**
上帝只垂青主動的人    \-\-\- 吳軍 《格局》大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是 web 應用安全防護方面的一個包:csrf。該包爲 Go web 應用中常見的跨站請求僞造(CSRF)攻擊提供預防功能。csrf 小檔案--------\| 「csrf 小檔案」 \|\| --- \|\| star \| 837 ⌘ [Read more](https://www.readfog.com/a/1684179784554352640) 2022-10-31T02:56:10Z **Go 大佬良心發現,願意給 map 加清除了?**
大家好,我是煎魚。一個東西來來回回的討論,關了又開,關了後建新的,新的被 ban 了,又發現新的論據,再打開新的。這在職場工作中很常見,在 Go 的提案討論中,也出現了...今天要分享的是 Go map 在 NaN 上的一個爭議和可能即將出現的 API 增加。背景和考題-----NaN 是什麼在計算機科學中,有一個神奇的值, 叫做:NaN(Not a Number,非數)。它是數值數據類型的一類值 ⌘ [Read more](https://www.readfog.com/a/1684179563939205120) 2022-10-31T03:22:43Z **Go: 當函數設計遇到切片**
切片 (slice) 是 Go 語言中的一種重要的也是最常用的同構數據類型。在 Go 語言編碼過程中,我們多數情況下會使用 slice 替代數組,一來是因爲其動態可擴展,二來在多數場合傳遞 slice 的開銷要比傳遞數組要小(這裏有一些例外 [1])。切片算是 “半個” 零值可用的類型 [2],爲什麼這麼說呢?當我們聲明一個切片類型實例但在未顯式初始化的情況下,我們不能直接對其做下標操作,比如:v ⌘ [Read more](https://www.readfog.com/a/1684181234486448128) 2022-10-31T03:35:09Z **Go:gops 如何與 runtime 交互?**
本文基於 Go 1.13 和 gops 0.3.7。 gops 旨在幫助開發人員診斷 Go 進程並與之交互。它提供了追蹤運行中的程序數秒鐘,通過 pprof 獲取 CPU 的 profile,甚至直接與垃圾回收器交互的能力。發現--gops 提供了一種發現服務,它可以列出計算機上運行的 Go 進程。不帶參數運行 gops 僅顯示 Go 進程。爲了舉例說明,我啓動了一個程序,該程序計算素數直到一百 ⌘ [Read more](https://www.readfog.com/a/1684182016826904576) 2022-10-31T14:23:49Z **go wire 入門連載二:單體應用注入項目**
之前寫過一篇文章,主要是介紹 wire 的多個依賴注入實現 go wire 入門實際使用中,很多人用的是框架,比如 kratos 是單體應用,這裏再着重介紹一下,這方面的使用。一、wire 介紹---------wire 依賴注入 有兩個核心概念 providers 和 injectors 。 語法如下:wire.Build(provide1, provide2,\*\*\*)providers,主要 ⌘ [Read more](https://www.readfog.com/a/1684222828015095808) 2022-10-31T14:23:06Z **go wire 入門**
一、介紹----wire 是提供 go 的依賴注入官方包地址爲 https://github.com/google/wire 我們打開官方 url,安裝方式如下go install github.com/google/wire/cmd/wire安裝後,就有 wire 命令可以用了,我試試在命令行工具裏,輸入 wire➜ wire輸出:wire: -: no Go files /Users/zhan ⌘ [Read more](https://www.readfog.com/a/1684222782892773376) 2022-10-31T14:28:13Z **slog:Go 官方版結構化日誌包**
Go 自誕生以來就在其標準庫 [1] 內置了 log 包作爲 Go 源碼輸出日誌 [2] 的標準組件,該包被廣泛應用於 Go 標準庫自身以及 Go 社區項目中。不過,針對 Go 標準庫 log 包,Go 社區要求改進的聲音始終不斷,主流聲音聚焦在以下幾點:log 包是爲了方便人類可讀而設計的,不支持便於機器解析的結構化日誌 (比如像 zap 那樣輸出 json 格式的日誌 [3]); 不支持 ⌘ [Read more](https://www.readfog.com/a/1684223104552898560) 2022-10-31T14:26:32Z **Go 服務端開發,請牢記這幾條**
服務端開發一般是指業務的接口編寫,對大部分系統來說,接口中 CURD 的操作佔了絕大部分。然而,網絡上總有調侃 “CURD 工程師” 的梗,以說明此類開發技術並不複雜。但我個人認爲,如果僅僅爲了找個框架填充點代碼完成任務,確實是簡單,但是人類貴在是一根“會思考的蘆葦”,如果深入的思考下去,在開發過程中還是會碰到很多通用的問題的。我們就用 go 的開發框架舉例子,它有兩種分化形式:一種以 beego ⌘ [Read more](https://www.readfog.com/a/1684222998469513216) 2022-11-02T03:27:40Z **Gin 增加超時控制中間件**
背景--有時候很多 API 有業務超時要求,就是數據必須在幾秒內返回,超時的話立刻結束,不用卡死在某一個頁面上。 目標--對這一類 API 特定處理,增加超時控制,不要影響別的 API 方案--方案很簡單,就是利用 go 提供的 context 技術對 gin 框架的 request 對象進行改造,使其具備超時控制機能。 代碼:package mainimport ( "cont ⌘ [Read more](https://www.readfog.com/a/1684362739806474240) 2022-11-02T03:31:48Z **Go 中調用外部命令的幾種姿勢**
引子--在工作中,我時不時地會需要在 Go 中調用外部命令。前段時間我做了一個工具,在釘釘羣中添加了一個機器人,@這個機器人可以讓它執行一些寫好的腳本程序完成指定的任務。機器人倒是不難,照着釘釘開發者文檔添加好機器人,然後 @這個機器人就會向一個你指定的服務器發送一個 POST 請求,請求中會附帶文本消息。所以我要做的就是搭一個 Web 服務器,可以用 go 原生的 net/http 包,也可以用 ⌘ [Read more](https://www.readfog.com/a/1684362999849127936) 2022-11-02T03:46:48Z **Go for 循環有時候真的很坑**
大家好,我是煎魚。不知道有多少 Go 的面試題和泄露,都和 for 循環有關。今天我在週末認真一看,發現了 redefining for loop variable semantics[1] ,看來大家踩到的坑都是一樣的。著名的硬核大佬 Russ Cox 表示他一直在研究這個問題,表示十年的經驗表明了當前語義的代價是很大的,得動一動,看看能不能打破兼容性原則。想了下之前 Go modules 的事 ⌘ [Read more](https://www.readfog.com/a/1684363943618908160) 2022-11-02T03:48:57Z **「Go 工具箱」web 中想讓 cookie 值更安全?推薦使用 securecookie 包**
在工作中,主動性不僅體現在像老黃牛一樣把本職工作做好,還要主動和領導溝通,承擔更多、更重要的任務。\-\-\- 吳軍 《格局》大家好,我是漁夫子。「Go 學堂」新推出 “Go 工具箱” 系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是 web 應用安全防護方面的另一個包:securecookie。該包給 cookie 中存儲的敏感信息進行編、解碼及解密、解密功能,以 ⌘ [Read more](https://www.readfog.com/a/1684364079088635904) 2022-11-02T14:38:35Z **用 Go 學設計模式 - 提煉流程,減少重複開發就靠它了-**
大家好,我是網管,今天繼續來給大家更新設計模式系列的文章,之前已經把四種建造型的設計模式更新齊全啦,沒有看過的小夥伴可以通過點擊上面和文章尾部的系列合集鏈接,進行查看。從今天開始未來的三篇設計模式系列文章,我們學的設計模式在項目開發中應用率非常高,尤其是應對業務系統的重複開發率高、流程無兜底策略、產品需求無序擴展這幾個痛點上非常有用。那在這裏我先拋出一個我自己總結的暴論:“模板、策略和職責鏈三個設 ⌘ [Read more](https://www.readfog.com/a/1684404950212382720) 2022-11-03T07:32:51Z **玩轉 Go 日誌框架 zap**
轉自: https://juejin.cn/post/7125012224623509540本文包括兩部分,一部分是源碼解讀,另一部分是對 zap 的增強。由於 zap 是一個 log 庫,所以從兩方面來深入閱讀 zap 的源碼,一個是初始化 logger 的流程,一個是打一條 log 的流程。Github 地址:github.com/uber-go/zap…[1]初始化 Logger- ⌘ [Read more](https://www.readfog.com/a/1684468762512822272) 2022-11-04T03:09:51Z **golang 源碼分析:nacos 服務發現**
https://github.com/alibaba/nacos 是阿里開源的服務發現和配置同步組件,上手非常容易,我們介紹下如何部署,然後看下 nacos 提供的 golang sdk:https://github.com/nacos-group/nacos-sdk-go 如何使用,分析下具體的源碼實現。docker run --name nacos-quick -e MODE= ⌘ [Read more](https://www.readfog.com/a/1684542813523513344) 2022-11-04T03:28:55Z **Go channel 的妙用**
昨天在內網上看到一篇講數據庫連接的文章,列出了一些 sql 包的一些源碼,我注意到其中取用、歸還連接的方式非常有意思——通過臨時創建的 channel 來傳遞連接。在 sql.DB 結構體裏,使用 freeConn 字段來表示當前所有的連接,也就是一個連接池。type DB struct {    freeConn     []driverConn}當需要拿連接的時候,從 freeConn 中取出 ⌘ [Read more](https://www.readfog.com/a/1684544013163663360) 2022-11-04T15:37:27Z **凹語言開源季度總結**
【CSDN 編者按】放眼各大編程語言排行榜,幾乎很難看到國產編程語言身影,伴隨着我國基礎軟硬件的發力與追趕,尤其是在操作系統、數據庫等技術領域的累積,我們也漸漸看到一些國產編程語言的誕生,例如由一羣 Go 語言愛好者發起的凹語言,2018 年籌備再到今年 7 月正式開源,其背後有着怎樣的故事,開源 3 個月後,其又進行了哪些改進與提升呢?責編 \| 夢依丹 出品 \| 凹語言技術團隊官方投稿凹語言正 ⌘ [Read more](https://www.readfog.com/a/1684589848143433728) 2022-11-07T02:52:00Z **Go 語言開源項目使用的函數選項模式**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在閱讀 Go 語言開源項目的源碼時,我們可以發現有很多使用 “函數選項模式”  的代碼,“函數選項模式” 是 Rob Pike 在 2014 年提出的一種模式,它使用 Go 語言的兩大特性,變長 ⌘ [Read more](https://www.readfog.com/a/1684813481377894400) 2022-11-08T14:42:41Z **go 語言 atomic-Value 源碼閱讀**
一、atomic.Value 介紹-----------------atomic.Value 被設計用來存儲任意類型的數據,所以它內部的字段是一個 interface{} 類型。源碼在 src/sync/atomic/value.go 中type Value struct { v interface{}}除了 atomic.Value 外,atomic 包內部定義了一個 ifaceWords ⌘ [Read more](https://www.readfog.com/a/1684948790481620992) 2022-11-09T09:46:10Z **golang 中 time 包使用教程之基礎使用篇**
在編寫程序中,我們經常會遇到時間戳和日期字符串相互轉換、獲取當前時間、時間之間的比較操作。本文主要介紹 golang 中關於時間常用的操作。golang 中的時間操作在 time 包中。時間操作的基礎是基於一個 Time 的結構體。時間相關的操作都需要先轉換成 Time 結構體,再通過 Time 結構體相關的函數轉換成目標值。如下圖:圖片再來看 Time 結構體在源文件中的定義:type Time ⌘ [Read more](https://www.readfog.com/a/1685020732594163712) 2022-11-09T09:54:03Z **一文搞懂 Go 標準庫 context 包**
自從 context 包在 Go 1.7 版本 [1] 加入 Go 標準庫,它就成爲了 Go 標準庫中較難理解和易誤用的包之一。在我的博客中目前尚未有一篇系統介紹 context 包的文章,很多來自 Go 專欄 [2] 或《Go 語言精進之路》[3] 的讀者都希望我能寫一篇介紹 context 包的文章,今天我就來嘗試一下 ^^。1. context 包入標準庫歷程2014 年,Go 團隊核心成員 ⌘ [Read more](https://www.readfog.com/a/1685021227550347264) 2022-11-09T09:58:26Z **Go 真實項目的性能案例研究**
爭做團隊核心程序員,關注「幽鬼」大家好,我是程序員幽鬼。Dolt DB[1] 是世界上第一個可以像 git 存儲庫一樣分支和合並、推送和拉取、分叉和克隆的 SQL 數據庫。我們從頭開始構建 Dolt 的存儲引擎,以加快這些操作。編寫行存儲引擎和 SQL 執行引擎並不容易。大多數人甚至不嘗試它是有原因的,但在 DoltHub,我們的構建方式不同。今天,我們將回顧幾個在對 Dolt 進行基準測試以使行 ⌘ [Read more](https://www.readfog.com/a/1685021503526113280) 2022-11-10T07:36:14Z **Go mistakes【譯】2-10 沒有意識到類型嵌入可能存在的問題**
2.10 沒有意識到類型嵌入可能存在的問題---------------------創建結構時,Go 提供了嵌入類型的選項。然而,如果我們不瞭解類型嵌入的所有影響,這有時可能會導致意想不到的行爲。在本節中,讓我們提醒我們如何嵌入類型,它帶來了什麼,以及可能的問題。在 Go 中,如果結構字段在沒有名稱的情況下聲明,則稱爲嵌入式結構字段。例如:type Foo struct {        Bar} ⌘ [Read more](https://www.readfog.com/a/1685103154732044288) 2022-11-10T10:05:32Z **go 語言源碼閱讀 unsafe 包和 unsafe-Pointer 以及 go 指針運算**
一、認識指針與指針類型-----------一個指針變量可以指向任何一個值的內存地址,它所指向的值的內存地址在 32 和 64 位機器上分別佔用 4 或 8 個字節,佔用字節的大小與所指向的值的大小無關。當一個指針被定義後沒有分配到任何變量時,它的默認值爲 nil。每個變量在運行時都擁有一個地址,這個地址代表變量在內存中的位置。Go 語言中使用在變量名前面添加 & 操作符(前綴)來獲取變量的內存地 ⌘ [Read more](https://www.readfog.com/a/1685112547949252608) 2022-11-11T08:37:25Z **go 讀取 yaml 文件**
一、介紹----yaml 作爲配置文件,基本在 go 中,被認爲默認的配置文件格式了。 yaml 格式介紹,詳見 https://www.ruanyifeng.com/blog/2016/07/yaml.html基本語法規則如下:大小寫敏感 使用空格縮進表示層級關係 縮進的空格數目不重要,只要相同層級的元素左側對齊就可以了。 我們看下面的 yaml 文件,新建 redis. ⌘ [Read more](https://www.readfog.com/a/1685197600734679040) 2022-11-11T08:36:20Z **Go 程序打成 rpm 包,也太簡單了**
環境準備-------首先是 rpmbuild 的相關依賴,無論是什麼語言寫的程序,只要是打包成 rpm 包,就都需要這些yum install -y gcc make rpm-build redhat-rpm-configrpmbuild 的使用,需要你寫不少的配置,非常繁瑣,有研究過的人自然知道其中的淚。但大多數情況下,一個簡單的 rpm 包可能就只是執行一個二進制文件而已,完全沒有去花費大量 ⌘ [Read more](https://www.readfog.com/a/1685197532795342848) 2022-11-14T02:49:19Z **Go 源碼 atomic-LoadUint32-- 和 Uint32 相關處理方法**
一、介紹 在 go 語言中,atomic 包提供和內存處理的原子化操作,在同步程序處理中,經常使用。 LoadUint32() 函數,提供加載原子化內存 addr,並返回 Uint32 格式。語法如下:// LoadUint32 atomically loads addr.func LoadUint32(addr uint32) (val uint32)在這裏 , addr 是地址,addr ⌘ [Read more](https://www.readfog.com/a/1685447490605780992) 2022-11-14T02:59:00Z **Go 學設計模式 - 程序流程要動態切換?用這個模式寫更絲滑**
大家好,我是每週在這裏陪你一起進步的網管。上篇文章我給大家分享了設計模式中的模版模式,給大家講了用模版模式在項目開發時提煉流程、減少重複開發的技巧。同時,在上一篇文章我也分享了我總結的一個暴論,那就是 “模板、策略和職責鏈三個設計模式是解決業務系統流程複雜多變這個痛點的利器”。今天我們繼續接着一起學習一下策略模式,以及用 Go 代碼怎麼實現策略模式。什麼是策略模式-------策略模式是一種行爲設 ⌘ [Read more](https://www.readfog.com/a/1685448099783348224) 2022-11-14T02:57:37Z **「每週譯 Go」在 Go 中導入包**
介紹------有時,你的代碼需要當前程序的基礎上增加更多的功能。在這些情況下,你可以使用軟件包來豐富你的程序。在 Go 中, 一個包表示磁盤上單個目錄中的所有文件。包可以定義可以在其他 Go 文件或包中引用的函數、類型和接口。本教程將帶你來完成軟件包的安裝, 導入和重命名。標準庫包--------標準庫是 Go 附帶的一組軟件包。這些軟件包包含許多用於編寫現代軟件的基本模塊。例如, fmt 軟 ⌘ [Read more](https://www.readfog.com/a/1685448013634441216) 2022-11-14T06:39:14Z **有趣的 Go HttpClient 超時機制**
hello,大家好呀,我是既寫 Java 又寫 Go 的小樓,在寫 Go 的過程中我經常對比這兩種語言的特性,踩了不少坑,也發現了不少有意思的地方,今天就來聊聊 Go 自帶的 HttpClient 的超時機制。Java HttpClient 超時底層原理在介紹 Go 的 HttpClient 超時機制之前,我們先看看 Java 是如何實現超時的。寫一個 Java 原生的 HttpClient,設置 ⌘ [Read more](https://www.readfog.com/a/1685461956246474752) 2022-11-14T06:35:40Z **Go 語言開發的超強企業級爬蟲管理平臺 - Crawlab**
Crawlab 是強大的網絡爬蟲管理平臺(WCMP),它能夠運行多種編程語言(包括 Python、Go、Node.js、Java、C#)或爬蟲框架(包括 Scrapy、Colly、Selenium、Puppeteer)開發的網絡爬蟲。它能夠用來運行、管理和監控網絡爬蟲,特別是對可溯性、可擴展性以及穩定性要求較高的生產環境。Crawlab 項目自 2019 年 3 月開始一直在不斷迭代,並且經歷了多 ⌘ [Read more](https://www.readfog.com/a/1685461731895250944) 2022-11-15T16:42:49Z **go 語言使用 xorm 讀取 mysql 小結**
一、介紹----xorm 是 go 語言的常用 orm 之一,用來操作數據庫。主要特性特性:支持根據數據庫自動生成 xorm 的結構體 支持 Struct 和數據庫表之間的靈活映射, 並支持自動同步 支持事務 支持使用 Id, In, Where, Limit, Join, Having, Table, Sql, Cols 等函數和結構體等方式作爲條件 支持查詢結果集導出 ⌘ [Read more](https://www.readfog.com/a/1685590527052976128) 2022-11-15T16:41:11Z **實戰 goproxy 爲中國 steam 登錄加速**
前言------我們公司領沃雲電腦平臺的用戶總是抱怨 steam 登錄常常失敗,自從 steam 撤走了中國的 CM 服務器後,每到高峯期就是網絡連接失敗的重災區,增量了 N 多平臺的東西,這次終於有時間來收拾這個登錄的問題了。先抓個包,確定需要的加速----------------首先還是用了 fiddler 工具對 steam 平臺登陸時抓了個包,抓到了他登陸時必用的接口 api.steamp ⌘ [Read more](https://www.readfog.com/a/1685590424054501376) 2022-11-15T16:46:45Z **揭祕 go 內存!**
本文推選自騰訊雲開發者社區 -【技思廣益 · 騰訊技術人原創集】專欄。該專欄是騰訊雲開發者社區爲騰訊技術人與廣泛開發者打造的分享交流窗口。欄目邀約騰訊技術人分享原創的技術積澱,與廣泛開發者互啓迪共成長。本文作者是騰訊後臺開發工程師邵珠光。在處理內存泄露的時候,想到了一種從內存中查看哪些對象的問題,於是就對實際跑着的程序內存進行了解析,通過可視化的方式有助於理解 go 的內存佈局和管理。基礎知識在本 ⌘ [Read more](https://www.readfog.com/a/1685590775198486528) 2022-11-16T06:34:36Z **「Go 工具箱」解析 http 中的 user-agent,就用這個包:user_agent**
大家好,我是漁夫子。「Go 學堂」新推出 “Go 工具箱” 系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦一個解析 HTTP 請求頭中 user-agent 字段的庫:useragent 。目前騰訊藍鯨智雲配置平臺都在用這個包。\| useragent 小檔案 \|\| --- \|\| star \| 734 \| used by \| 622 \|\| contributors \| ⌘ [Read more](https://www.readfog.com/a/1685642858249424896) 2022-11-16T13:55:21Z **使用反射操作 channel**
今年教師節極客時間送給講師 4999 SVIP 卡,一直沒顧過來用,上週激活後在極客時間的衆多精品課和專欄中徜徉,收穫頗豐。尤其是在拜讀鳥窩老師的《Go 併發編程實戰課》[1] 後,get 到一個以前從未用過的 “技能點”:使用 reflect 操作 channel,這裏整理一下,把它分享給大家。1. channel 常規語法的 “限制”Go 語言實現了基於 CSP(Communicating S ⌘ [Read more](https://www.readfog.com/a/1685670588489764864) 2022-11-21T06:54:04Z **golang 本地緩存選型及原理總結**
一、本地緩存需求\-\-\-\-\-\-\-\-需要較高讀寫性能 \+ 命中率 支持按寫入時間過期 支持淘汰策略 需要解決 gc 問題,否則大量對象寫入會引起 stw 掃描標記時間過長,cpu 毛刺嚴重 二、本地緩存調研--------freecache:https://github.com/coocood/freecache bigcache:https://github.com/a ⌘ [Read more](https://www.readfog.com/a/1686097067954507776) 2022-11-21T15:41:56Z **「每週譯 Go」理解 Go 中包的可見性**
介紹------當創建一個《Go 中的包》(點擊跳轉查看往期推文)時,最終的目標通常是讓其他開發者可以使用這個包,無論是高階包還是整個程序。通過《導入包》(點擊跳轉查看往期推文),你的這段代碼可以作爲其他更復雜的工具的構建模塊。然而,只有某些包是可以導入的。這是由包的可見性決定的。這裏的 可見性 是指一個包或其他構造可以被引用的文件空間。例如,如果我們在一個函數中定義一個變量,那麼這個變量的可見 ⌘ [Read more](https://www.readfog.com/a/1686130278433656832) 2022-11-21T15:51:43Z **go build 打包二進制執行文件與 用 docker 打包 -鏡像 image- 入門**
一、go 打包而進駐文件------------1、安裝 go 環境我們可以從官方 https://go.dev/dl 下載對應系統的 go 安裝文件。 我這裏是 mac 系統,x86 架構,所以我選擇了 安裝完成後執行一下 go version 輸出如下:go version go1.19.7 darwin/amd642、新建一個實驗目錄mkdir hello && cd hello ⌘ [Read more](https://www.readfog.com/a/1686130893643681792) 2022-11-21T15:51:06Z **三種獲取 Go 項目根目錄的方式,讓你做架構,選哪種?**
大家好,這裏是每週都陪你進步的網管~在搭建項目中一般都會有確定項目根目錄的絕對路徑的需求,一旦有了根目錄的絕對路徑,就能以這個根目錄爲基準,設置靜態文件、配置文件所在的目錄,這樣做的好處是無論把項目部署到哪個目錄下,執行程序時都不會出現No such file or directory 這樣的錯誤。今天就總結一下在 Go 程序裏邊怎麼獲取項目的根目錄絕對路徑。在網上搜索怎麼獲取 Go 項目的根目錄 ⌘ [Read more](https://www.readfog.com/a/1686130855737659392) 2022-11-22T03:13:10Z **PGO 是啥,咋就讓 Go 更快更猛了?**
大家好,我是煎魚。Go1.20 即將發佈,近期很多大佬提到一個關鍵詞 PGO,說是有很大的提高,很猛... 稱其爲本迭代(Go1.20)最大的功能特色,這個餅讓我一愣一愣,不禁思考是什麼,咋就很快了。今天就由煎魚和大家一起學習這個新特性。快速瞭解----PGO 是什麼Profile-guided optimization (PGO),翻譯過來是使用配置文件引導的優化。也被稱爲:profile-di ⌘ [Read more](https://www.readfog.com/a/1686173767302221824) 2022-11-22T07:12:41Z **Go 中的 HTTP 資源泄漏之謎**
我喜歡排查泄露的問題。這是一個智力之謎,我總能在這個過程中學到新東西。這個謎就像你在電視上讀到或看的一樣:細節是猥瑣的,從不令人沮喪,最後,我們總能得到一個很好的合乎邏輯的解釋。這就是計算機的偉大之處:它們最終是可以預測的,所以我可以安全地扮演偵探角色,因爲我知道我總是能得到我的罪犯。如果你討厭推理小說或者只想學習參考,你可以跳到關鍵要點 (劇透警告,咄?)。泄露 Dogfood--------- ⌘ [Read more](https://www.readfog.com/a/1686188836521086976) 2022-11-22T16:51:16Z **Go 中的可尋址和不可尋址怎麼理解?**
大家好,我是明哥。 本專欄內容,已經上傳 github:https://github.com/iswbm/golang-interview請大家幫幫忙去點個小 ⭐⭐,在那裏我對題庫進行了分類整理。本篇問題:Go 中的可尋址和不可尋址怎麼理解?1. 什麼叫可尋址?------------可直接使用 & 操作符取地址的對象,就是可尋址的(Addressable)。比如下面這個例子func main( ⌘ [Read more](https://www.readfog.com/a/1686225238115848192) 2022-11-22T16:50:04Z **零拷貝技術第二篇:Go 語言中的應用**
書接上回: 零拷貝技術第一篇:綜述 [1], 我們留了一個小尾巴,還沒有介紹 Go 語言中零拷貝技術的應用,那麼本文將帶你瞭解 Go 標準庫中零拷貝技術。Go 標準庫中的零拷貝-----------在 Go 標準庫中,也廣泛使用了零拷貝技術來提高性能。因爲零拷貝相關的技術很多都是通過系統調用提供的,所以在 Go 標準庫中,也封裝了這些系統調用,相關封裝的代碼可以在 internal/poll[2] ⌘ [Read more](https://www.readfog.com/a/1686225162409709568) 2022-11-23T03:28:49Z **go byte 字節與 ascii 碼**
一、ascii 碼介紹----------- ascii 碼總有有 128 位,用來表示常用的字符。 在 go 語言中我們用 byte 一個 uint8 (0-255) 來展示 ascii 字符。 二、go 表示 ascii 碼 0-9-------------------1、表示 ascii 的 0-9 在 ascii 嗎中utWEQ1我們用 go 語言打印一下:import "test ⌘ [Read more](https://www.readfog.com/a/1686265349082812416) 2022-11-23T14:37:10Z **Go 語言手冊**
Golang 是一門非常棒的簡潔且快速的現代編程語言。它是編譯的、開源的、強類型的。Golang——也被稱爲 Go——由谷歌工程師創建,主要目標如下:讓他們的項目編譯(和運行)更快 要簡單,這樣人們可以在短時間內學會 要足夠底層,但也要避免過於關注底層 可移植(經過編譯的 Go 程序不需要其他文件的支持,就可以跨平臺運行,因此它們很輕易分發) 簡潔而枯燥、穩定、可預測,從而 ⌘ [Read more](https://www.readfog.com/a/1686307398230315008) 2022-11-23T14:41:23Z **Golang 微服務框架,kratos 與 hertz 對比**
早年,如果使用 go 來做微服務,可選框架只有go-zero、go-micro、go-kit等。但隨着 Golang 的發展,社區也湧現出了一些新型的微服務框架,國內公司也開源了不少微服務框架,本文就主要介紹下嗶哩嗶哩的kratos與字節跳動的hertz。hertz 與 kratos 介紹-----------------hertz簡介Hertz[həːts] 是一個 Golang 微服務 H ⌘ [Read more](https://www.readfog.com/a/1686307663298793472) 2022-11-24T03:32:12Z **Go 如何從零編寫 ProtoBuf 插件**
go 精通 protobuf 連載五:如何從零編寫 ProtoBuf 插件 本期的主要內容將手把手教會大家,編寫 probuf 的 go 插件,以我自己編寫的一個生成結構圖的插件爲例子。項目位於 https://github.com/hisheng/protoc-gen-go-struct一、自定義 ProtoBuf 插件介紹-------------------我們常用的 go 支持 prot ⌘ [Read more](https://www.readfog.com/a/1686356158622830592) 2022-11-25T06:55:09Z **golang 源碼分析:http 代理和 https 代理**
首先還是上代碼:https://github.com/xiazemin/dnsproxy,然後我們思考幾個問題:我們使用 charles 抓包的時候使用的是 https 代理還是 http 代理?使用 charles 代理的時候爲什麼要裝 charles 的證書,有什麼作用?http 代理能代理 https 的請求麼?首先測試下: 1,https 代理 https 請求 % H ⌘ [Read more](https://www.readfog.com/a/1686459524342452224) 2022-11-25T06:53:24Z **go channel 詳細介紹**
一、介紹----go 以高併發著稱,而支撐這個高併發的,goroutine 協程是主要原因之一。 goroutine 讓我們輕鬆實現異步,非阻塞。 但這種異步,也帶來的問題是執行順序的不確定性。 以及數據同步的問題。在這種情況下,go 官方引入了 channel 來通信,實現數據共享。channel是用於goroutine的數據通信 在這張圖上面,我們在主協程,總共開了 5 個 gorou ⌘ [Read more](https://www.readfog.com/a/1686459413794230272) 2022-11-28T02:54:18Z **Go: 一些關於時間和定時任務的庫**
避免重複發明輪子。如果有一些好用的庫,我們就直接使用就好了,沒必要做一些重複的工作,如果這些庫不能滿足需求,不妨提交 pull request 或者 clone 它們,提升它們,優化它們,當前前提是你得知道它們。這篇文章給大家介紹一些關於時間和類似 linux cron 功能的定時任務庫。jinzhu/now----------張金柱大佬除了給大家貢獻了 gorm 外,還寫了一些好用的 Go 庫, ⌘ [Read more](https://www.readfog.com/a/1686716161570476032) 2022-11-28T02:52:51Z **「每週譯 Go」如何在 Go 中編寫條件語句**
介紹------條件性語句是每一種編程語言的組成部分。通過條件語句,我們可以讓代碼有時運行,有時不運行,這取決於當時程序的條件。當我們完全執行程序的每個語句時,我們並沒有要求程序評估特定的條件。通過使用條件語句,程序可以確定某些條件是否被滿足,然後被告知下一步該做什麼。讓我們來看看一些使用條件語句的例子。如果學生的考試成績超過 65%,報告她的成績通過;如果沒有,報告她的成績不合格。 如果 ⌘ [Read more](https://www.readfog.com/a/1686716071265013760) 2022-11-28T02:50:06Z **使用 Asynq 實現 Go 異步任務處理**
1\. 介紹-------Asynq 是一個 Go 庫,用於對任務進行排隊並與工作人員異步處理它們。它的工作原理:客戶端將任務放入隊列 服務器從隊列中拉出任務併爲每個任務啓動一個工作 goroutine 多個工作人員同時處理任務 倉庫鏈接:https://github.com/hibiken/asynq)2. 快速開始--------- 2.1 準備工作確保已安裝並運行了 redi ⌘ [Read more](https://www.readfog.com/a/1686715897664868352) 2022-11-28T15:18:27Z **盤點那些 Go 的最佳應用場景**
大家好,我是程序員幽鬼。Golang 是一種在開發人員中越來越受歡迎的編程語言。它是一種編譯型語言,與 C/C++ 和 Java 有一些相似之處,與其他語言相比具有多種優勢。Golang 可用於廣泛的應用程序,例如 Web 開發、機器學習和系統編程。如果你正在尋找一種構建可擴展應用程序的有效方法,Golang 是一個很好的選擇。此外,它是開源的,這意味着有大量可用的庫可以幫助你使應用程序運行得更快 ⌘ [Read more](https://www.readfog.com/a/1686762980327395328) 2022-11-28T15:29:23Z **Golang GC 從原理到優化**
這篇文章與筆者之前所寫幾篇不同,是一篇綜述型的文章,將從 GC 理論、在 Golang 中的應用、以及如何去做優化,這三個角度逐次進行闡述,文章中對於一些技術點會引用到多篇文章,希望讀者也都能進行閱讀,這有助於更全面的瞭解 Golang GC。同時,特別鳴謝 @王德宇 同學對這篇文章的斧正,以及撰寫過程中的諸多幫助與解答。理論GC 和內存分配方式是強相關的兩個技術,因此在分析兩者的設計原理之時,要 ⌘ [Read more](https://www.readfog.com/a/1686763667964661760) 2022-11-29T03:59:18Z **「Go 工具箱」web 中的 session 管理,推薦使用 gorilla-sessions 包**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。在 web 開發中,大家一定會使用到 session。在 go 的很多 web 框架中並沒有集成 session 管理的中間件。要想使用 session 功能,我推薦大家使用這個包:gorilla/sessions。以下是該包的基本情 ⌘ [Read more](https://www.readfog.com/a/1686810848094425088) 2022-11-29T04:05:18Z **一款好用的 Go 調用鏈可視化工具**
在接手他人代碼或調研一些開源項目時,如果能夠理清其中的代碼調用鏈路,這將加速我們對實現的理解。本文介紹一款工具 go-callvis,它能夠將 Go 代碼的調用關係可視化出來,並提供了可交互式的 web 服務。go-callvis 使用-------------依賴Go 1.17+ Graphviz (可選,當工具指定了 -graphviz 時需要) 工具安裝go get -u git ⌘ [Read more](https://www.readfog.com/a/1686811226124947456) 2022-12-01T03:37:18Z **深入理解 golang 的互斥鎖**
在開始之前,我們需要知道鎖實現的幾種方式。信號量 操作系統中有 P 和 V 操作。P 操作是將信號量值減去 1,V 操作是將信號量值增加 1. 因此信號量的操作模式爲:初始化,給它一個非負整數值。 在程序試圖進入臨界區之前需要先運行 P 操作,然後會有兩種情況。 當信號量 S 減少到負值時,該過程將被阻止並且無法繼續。這個時候,進程會被阻塞。 當信號量 S 不爲負時,進程可以進入 ⌘ [Read more](https://www.readfog.com/a/1686990658407075840) 2022-12-01T03:44:04Z **Go 服務自動收集線上問題現場**
前言--對於 pprof,相信熟悉 Go 語言的程序員基本都不陌生,一般線上的問題都是靠它可以快速定位。但是實際項目中,很多時候我們爲了性能都不會開啓它,但是出了問題又要靠它來分析。好在 go-zero 已經幫我們很好的集成進來了,我們只需要像開關一樣去開啓、關閉它即可,這樣我們就可以配合運維監控,當出現 cpu、內存等異常情況時候,自動開始開啓收集(比如大半夜你睡的正香的時候),那麼第二天可以通 ⌘ [Read more](https://www.readfog.com/a/1686991083596255232) 2022-12-02T09:58:12Z **Go 開發常用操作技巧 -- 字符串**
Go 語言字符串的字節使用的是 UTF-8 編碼,是一種變長的編碼方式。使用 1~4 個字節表示一個符號,根據不同的符號而變化字節長度。含中文字符串截取字符串的長度 我們可以使用 len()函數來獲取字符串的長度,英文爲 1 個字節長度,中文爲 3 個字節長度。可以使用 變量[n]的方式來獲取第 n+1 個字節,返回的是對應的 Unicode 值。其中 n 的範圍是 [0,len(n)-1] ⌘ [Read more](https://www.readfog.com/a/1687105219401453568) 2022-12-05T04:24:59Z **Go 語言代碼風格規範 - 指南篇**
每門開發語言都會有其特有的風格規範(亦或指南),開發者遵循規範能帶來顯著收益,有效促進團隊協作、減少 bug 錯誤、降低維護成本等。Google 開源的 Google Style Guides (https://google.github.io/styleguide/)爲多種編程語言提供了風格規範,包括 C++、Java、Python、JavaScript 等。在 2022 年 11 月,Go 語 ⌘ [Read more](https://www.readfog.com/a/1687356045834424320) 2022-12-05T04:21:44Z **「每週譯 Go」如何在 Go 中編寫 Switch 語句**
介紹--條件語句(點擊查看往期推文) 使程序員有能力指導他們的程序在某個條件爲真時採取某些行動,在條件爲假時採取另一種行動。經常,我們想把一些 變量 [1] 與多個可能的值進行比較,在每種情況下采取不同的行動。僅僅使用if語句 [2] 就可以做到這一點。然而,編寫軟件不僅是爲了讓事情順利進行,也是爲了向未來的自己和其他開發者傳達你的意圖。switch是一個替代性的條件語句,對於傳達你的 Go 程 ⌘ [Read more](https://www.readfog.com/a/1687355841491079168) 2022-12-07T03:14:58Z **玩轉 Go 鏈路追蹤**
前言--鏈路追蹤是每個微服務架構下必備的利器,go-zero 當然早已經爲我們考慮好了,只需要在配置中添加配置即可使用。關於 go-zero 如何追蹤的原理追溯,之前已經有同學分享,這裏我就不再多說,如果有想了解的同學去 https://mp.weixin.qq.com/s/hJEWcWc3PnGfWfbPCHfM9g 這個鏈接看就好了。默認會在 api 的中間件與 rpc 的 intercept ⌘ [Read more](https://www.readfog.com/a/1687532835116781568) 2022-12-08T03:32:06Z **一起用 Go 做一個小遊戲(上)**
引子--最近偶然看到一個 Go 語言庫,口號喊出 “一個超級簡單(dead simple)的 2D 遊戲引擎”,好奇點開了它的官網。官網上已經有很多可以在線體驗的小遊戲了(利用 WASM 技術)。例如曾經風靡一時的 2048:當然只要安裝了 Go,我們也鍵入下面的命令本地運行這個遊戲:$ go run -tags=example github.com/hajimehoshi/ebiten/v2/e ⌘ [Read more](https://www.readfog.com/a/1687624509689008128) 2022-12-08T16:05:38Z **Go 爲什麼能成功**
大家在入門 Go 語言時,多埋頭於 Go 語法,忙於練手或快速完成公司的項目,無暇思考。但當大家到了要進階,要衝刺高級階段的時候,我建議你不能再稀裏糊塗了。既然入了 Go 這個坑,在進入高級階段前,我們最好在門口的 “影壁牆” 前駐留一下。仔細思考一下我們投入這麼多精力研究的 Go 爲什麼能成功,後續還能否持續成功下去。你要有自己的基本的判斷,自我暗示也好,堅定信心也罷,我們要爲繼續攀登 Go 高 ⌘ [Read more](https://www.readfog.com/a/1687671918242664448) 2022-12-08T16:03:19Z **一起用 Go 做一個小遊戲(下)**
打包資源----使用 file2byteslice 包我們可以將圖片和 config.json 文件打包進二進制程序中,之後編譯生成一個二進制程序。然後拷貝這一個文件即可,不用再拷貝圖片和其他配置文件了。golang 有很多第三方包可以將打包資源,原理其實很簡單——讀取資源文件的內容,然後生成一個 go 文件,在這個文件中創建一個變量保存這個文件的二進制內容。我們將使用 ebiten 作者編寫的 ⌘ [Read more](https://www.readfog.com/a/1687671772334362624) 2022-12-09T15:22:11Z **使用 Go 和 C 進行 CUDA 編程**
關於 CUDA-------NVIDIA 和 AMD 等圖形芯片製造商的圖形處理器 (GPU) 銷量一直在飆升,這主要歸功於加密貨幣礦工和機器學習應用程序,它們在遊戲和模擬之外發現了這些圖形處理器的用途。這主要是因爲 GPU 提供了通用處理器所沒有的並行能力,而這些能力恰好非常適合大規模哈希和矩陣計算等操作,這些操作是挖掘和機器學習工作負載的基礎。NVIDIA 的 CUDA 爲可用於數值計算的圖形 ⌘ [Read more](https://www.readfog.com/a/1687759781040852992) 2022-12-12T02:45:04Z **Go1-20 新特性:切片轉數組**
你好,我是小四,你情商高,也可以叫我四哥~Go1.20 正式版本還沒有發佈,官方計劃 2023 年 2 月份發佈。不過,Go1.20rc 已經在 12 月 8 號發佈了,一起來嚐鮮。語言特性方面主要有四個優化,其中最主要的添加了 切片轉數組 功能。其實在 Go1.17 版本,Go 語言已經有 切片轉數組指針 的功能。可以看 P 神的這篇文章 [1],瞭解下詳情。引入 切片轉數組指針 特性之後,br ⌘ [Read more](https://www.readfog.com/a/1687983938207846400) 2022-12-12T02:44:37Z **golang 實現 Pub-Sub 模式**
一、什麼是 Pub/Sub 模式----------------Pub/Sub 是一種可擴縮的異步消息傳遞服務,可將生成消息的服務與處理這些消息的服務分離開來。Pub/Sub 允許服務異步通信,延遲時間大約爲 100 毫秒。Pub/Sub 用於流式分析和數據集成流水線,以注入和分發數據。無論是作爲用於消息整合的消息傳遞中間件,還是作爲並行處理任務的隊列,它都非常有效。通過 Pub/Sub,可以創建 ⌘ [Read more](https://www.readfog.com/a/1687983910268538880) 2022-12-12T09:39:57Z **Go 版本大於 1-13,程序裏這樣做錯誤處理才地道**
大家好,這裏是每週都在陪你進步的網管。之前寫過幾篇關於 Go 錯誤處理的文章,發現文章裏不少知識點都有點落伍了,比如 Go 在 1.13 後對錯誤處理增加了一些支持,最大的變化就是支持了錯誤包裝(Error Wrapping),以前想要在調用鏈路的函數里包裝錯誤都是用"github.com/pkg/errors"這個庫。Go 在 2019 年發佈的Go1.13版本也採納了錯誤包裝,並且還提供了幾個 ⌘ [Read more](https://www.readfog.com/a/1688010040825450496) 2022-12-12T09:38:10Z **如何在 Go 中構造 for 循環**
介紹------在計算機編程中,循環 是在滿足某些條件之前循環重複執行一段代碼的代碼結構。在計算機編程中使用循環可以讓您自動並重復地執行類似的任務。想象一下,如果您有一個需要處理的文件列表,或者您想計算一篇文章的行數。您就可以在代碼中使用循環來解決這樣的問題。在 Go 中,for 循環是基於循環計數器或循環變量實現代碼的重複執行。與其他具有多個循環結構(例如 while , do 等 )的編程語 ⌘ [Read more](https://www.readfog.com/a/1688009928876331008) 2022-12-13T02:49:43Z **最好的 Go 框架:沒有框架?**
作爲 Go 語言的團隊領導者這幾年時間,我從初學者那裏聽到的最常見問題是 “我應該使用什麼框架?”。我的想法是使用過去的語言經驗去編寫 Go 程序往往會讓結果變得非常糟糕。其他的編程語言已經建立了 “默認” 的框架。Java 有 Spring,Python 有 Django 和 Flask,Ruby 有 Rails,C# 有 ASP.NET,Node 有 Express,PHP 有 Symfony ⌘ [Read more](https://www.readfog.com/a/1688074827766796288) 2022-12-13T02:51:16Z **Go 實現後臺任務調度系統**
一、背景----平常我們在開發 API 的時候,前端傳遞過來的大批數據需要經過後端處理,如果後端處理的速度快,前端響應就快,反之則很慢,影響用戶體驗。針對這種場景我們一般都是後臺異步處理,不需要前端等待所有的都執行完才返回。爲了解決這一問題,需要我們自己實現後臺任務調度系統。二、任務調度器實現---------poll.gopackage pollerimport ( "context" "fmt ⌘ [Read more](https://www.readfog.com/a/1688074925644025856) 2022-12-13T03:08:57Z **當 go-sql-driver 遇到 mysql timestamp 的離奇 bug**
hi,大家好,我是 haohongfan。對於 Go CURD Boy 來說,github.com/go-sql-driver/mysql 這個庫都不會陌生。或許有些人可能沒太留意,直接就複製粘貼了 import。比如我們使用 gorm 的時候,如果不加 "github.com/go-sql-driver/mysql" 的話,就會報:panic: sql: unknown driver "mys ⌘ [Read more](https://www.readfog.com/a/1688076038368759808) 2022-12-14T02:40:28Z **Go 開發常用操作技巧 -- 數組**
在 go 語言中,數組的長度是不可變的,這就導致數組在實際使用中不是很靈活,爲此,設計了動態數組 --Slice(切片)。切片是對數組的一個連續片段的引用,所以切片是一個引用類型。其內部結構包含地址、大小和容量。切片的創建有以下四種方式:make([]Type,length,capacity) make([]Type,length) []Type{} []Type{value1, ⌘ [Read more](https://www.readfog.com/a/1688164842917171200) 2022-12-14T03:05:57Z **Go 開發常用操作技巧 --map**
map 是一種特殊的數據類型,它是一種元素對的「無序」集合,元素對爲 鍵 (key) 值(value) 形式。我們可以通過 key 來快速找到與之對應的 value。map 是引用類型,聲明方式: var name map[keytype]valuetype,name 爲 map 的變量名,keytype 爲鍵類型,valuetype 爲鍵對應的值類型。聲明時可以不需要指定 map 的長度,因爲 ⌘ [Read more](https://www.readfog.com/a/1688166446363938816) 2022-12-15T02:38:02Z **Go:如何使用 Google Translate 翻譯文本**
你有沒有想過如何開發自己的翻譯器?或者你是否遇到過需要開發文本翻譯功能的需求?那麼本文關於 Golang 如何使用谷歌翻譯 API 翻譯文本的教程就是爲你準備的!讓我們來看看今天的教程都講了些什麼。RapidAPI 的理解和實現 創建 API 和用戶接口 實現服務端文本翻譯邏輯 初始化配置先初始化一個 Go 項目:在本地創建 "google-translate 文件夾,在這個文件 ⌘ [Read more](https://www.readfog.com/a/1688255286710734848) 2022-12-15T02:59:49Z **一起用 Go 做一個小遊戲(中)**
限制飛船的活動範圍---------上一篇文章還留了個尾巴,細心的同學應該發現了:飛船可以移動出屏幕!!!現在我們就來限制一下飛船的移動範圍。我們規定飛船可以左右超過半個身位,如下圖所示:很容易計算得出,左邊位置的 x 座標爲:x = -W2/2右邊位置的座標爲:x = W1 - W2/2修改 input.go 的代碼如下:func (i Input) Update(ship Ship, cfg ⌘ [Read more](https://www.readfog.com/a/1688256657376776192) 2022-12-19T03:44:31Z **一文讀懂主流 web 框架中路由的實現原理**
一、什麼是路由-------路由,就是 url 地址到業務處理代碼的映射。當用戶輸入一個 url 地址時,服務器該知道該用戶返回什麼內容。比如,當用戶點擊登錄時,服務器應該做登錄相關的事情,並給用戶返回登錄成功或失敗的頁面。當用戶點擊退出時,服務器應該做和退出相關的事情(比如清理用戶登錄的數據),並返回給用戶退出之後的頁面。一個 url 到一個具體的處理函數之間的映射叫做一條路由。多條路由組成路由 ⌘ [Read more](https://www.readfog.com/a/1688621858170179584) 2022-12-21T02:33:43Z **Go 開發常用操作技巧 -- 結構體**
結構體是由一系列相同或不相同類型數據組成的數據集合。 結構體的成員(字段)的特性:字段名必須唯一 字段有自己的類型和值 字段的類型也可以是結構體,甚至是字段所在結構體的類型 結構體定義格式如下:type 類型名 struct{  字段1 類型1  字段2 類型2  //...}結構體初始化type Mystruct struct { Name    string Address ⌘ [Read more](https://www.readfog.com/a/1688798597631545344) 2022-12-21T02:32:17Z **Context 超時處理應該這麼做**
1、超時處理有問題代碼-----------只通過 select 監聽超時信號,沒有處理正常邏輯處理。package mainimport ( "context" "fmt" "sync" "time")var wg sync.WaitGroupfunc main() { // 定義一個3s超時context 所有衍生出來的goroutine必須在3s內完成 否則會cancel掉 ctx, can ⌘ [Read more](https://www.readfog.com/a/1688798506925527040) 2022-12-22T13:39:29Z **Go 開發常用操作技巧 -- 模塊管理**
Go 依賴管理經歷了 3 個階段,GOPATH、Go Vendor、Go Module。GOPATH GOPATH 是 Go 語言的一個環境變量,它是 Go 項目的工作區。目錄有 3 個結構:bin:項目編譯的二進制文件 pkg:項目編譯生成的 lib 包 src:項目源碼 go get 會下載最新版本的包到 src 目錄下。因爲 src 下只能允許一個版本的存在,所以對於 ⌘ [Read more](https://www.readfog.com/a/1688931080792543232) 2022-12-23T02:26:19Z **Go 開發常用操作技巧 --channel**
在 Go 語言中,提倡使用通信來共享內存,而不是通過共享內存來通信,這裏的通信就是通過 channel 發送接收消息的方式進行數據傳遞,而不是通過修改同一個變量。所以在數據流動、傳遞的場景中要考慮優先使用 channel,它是併發安全的,性能也不錯。channel 聲明ch := make(chan string)使用 make 函數 chan 是關鍵字,表示 channel 類型,chan ⌘ [Read more](https://www.readfog.com/a/1688979325773254656) 2022-12-26T03:40:06Z **Go 學設計模式 -- 怕把核心代碼改亂,記得用代理模式**
大家好,這裏是每週都陪你進步的網管~其實也不是每週啦,上週陽了~實在是進步不動了...... 這周咱們繼續之前擱置了一段時間的設計模式系列。上一次咱們分享的是職責鏈模式,在文章最後提到了一下裝飾器模式,兩者雖然結構上類似但在用途上還是有區別的,而裝飾器模式本身算是代理模式的一個特殊應用,所以這篇文章我們就先來學習一下代理模式的構成和用法,後面再來學習裝飾器。老看我文章的同學可能發現了,雖然教材上是 ⌘ [Read more](https://www.readfog.com/a/1689255758239207424) 2022-12-26T06:18:58Z **Go 框架 Gin 怎麼實現允許前端跨域請求?**
大家好,我是 frank。 歡迎大家關注「Golang 語言開發棧」公衆號。 01 介紹 在前後端分離的項目中,前端在請求服務端提供的接口時,往往會遇到跨域請求的問題,服務端可以通過 CORS 的方式解決,限於篇幅,關於跨域和 CORS 的詳細介紹,讀者朋友們可以自行查閱相關資料。Go 框架 Gin 官方提供了 CORS 中間件,可以很方便地實現使用 CORS 解決跨域問題,本文我們介 ⌘ [Read more](https://www.readfog.com/a/1689265753131421696) 2022-12-27T03:09:09Z **講一個故事說明使用匯編語言的必要性**
\- 1 -有一天,有一個程序員叫做 Bob,他寫了一個用 Go 語言實現的階乘函數。但是,當數據規模變大時,運行速度非常慢。於是,他的老闆讓他改成用匯編語言實現。Bob 很不情願,但還是學習了彙編語言,並寫出了一個能跑得飛快的階乘函數。最後,Bob 成爲了一名出色的彙編程序員,並因爲他的階乘函數而獲得了巨大的成功。他明白,彙編語言可以讓他的程序更快、更簡潔。所以,如果你想寫出高效、簡潔的程序,就要 ⌘ [Read more](https://www.readfog.com/a/1689344408308256768) 2022-12-27T11:09:58Z **3 分鐘帶你通過 Go 生成宣傳海報!**
對於公網應用來說,海報功能是非常非常重要的,它不僅能擴大應用的知名度,還能起到營銷的作用。那從技術上講,海報該怎麼去做呢?大部分應用都會選擇前端渲染,比如 canvas 渲染,這是最常見的。當然也有一些應用選擇後端生成,兩者各有各的好處,也有各自的缺點。這裏我們不去討論前端怎麼渲染,只講後端怎麼生成。先來看下我們將要完成的效果,這是沒有加文字和二維碼的圖片:這是加上我們的二維碼和漢字的樣子:因爲微 ⌘ [Read more](https://www.readfog.com/a/1689374658200178688) 2022-12-27T14:35:21Z **Go 變量遮蔽導致的意外錯誤**
今天要介紹的第一個易犯錯誤就是,變量作用域導致的。變量的作用域是指變量可以被引用的範圍。換句話說,是應用程序中變量名綁定有效的部分。在 Go 語言中,在代碼塊中聲明的變量名可以在內部代碼塊中重新聲明。這個原理被稱爲變量遮蔽,容易犯常見錯誤。下面的示例顯示了由於變量遮蔽而產生的意外副作用。它以兩種不同的方式創建 HTTP 客戶端,這取決於 tracing 的值:var client http.Cli ⌘ [Read more](https://www.readfog.com/a/1689387579910230016) 2022-12-28T02:42:55Z **通過分析 gin、beego 源碼,讀懂 web 框架對 http 請求處理流程的本質**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。在實際工作中,大家一定會用到 go 的 web 框架。那麼,你知道各框架是如何處理 http 請求的嗎?今天就主流的 web 框架gin、beego框架以及 go 標準庫net/http來總結一下 http 請求的流程。一、標準庫 n ⌘ [Read more](https://www.readfog.com/a/1689433355357097984) 2022-12-30T03:27:46Z **Cobra 眼睛蛇 - 強大的 Golang CLI 框架**
閱讀過 k8s 源碼的同學,應該都知道k8s Scheduler、kubeadm、kubelet等核心組件的命令行交互全都是通過 spf13 寫的Cobra庫來實現。本文就來介紹下 Cobra 的相關概念及具體用法。(內容譯自官方文檔)Cobra logo關於--Cobra 是一個用於 Go 的 CLI 框架。它包含一個用於創建 CLI 應用程序的庫和一個快速生成 Cobra 程序和命令文件的工具 ⌘ [Read more](https://www.readfog.com/a/1689617370109284352) 2023-01-02T02:43:14Z **詳解全網最快 Go 泛型跳錶【內附源碼】**
導讀 \| 今年開發者期盼已久的、泛型的 go1.18 發佈了,但目前基於泛型的容器實現案例很稀缺。騰訊後臺開發工程師陳峯實現了一套類似 C++ 中 STL 的容器和算法庫。其中有序的 Map 用跳錶實現,並優化到極致性能。本文作者將分享優化的思路並公開源碼,供各位開發者參考。 背景 最近一年我們用 Go 語言實現的業務系統至少 70%,因此我們 Review 了大量的 Go 代碼,也看了很多相 ⌘ [Read more](https://www.readfog.com/a/1689886359310929920) 2023-01-06T03:05:50Z **最全 Go select 底層原理,一文學透高頻用法**
導語 \| 在日常開發中,select 語句被高頻使用。但目前,全網分析 select 在編譯期和運行時的完整底層原理資料,非常匱乏。本文基於 Go1.18.1 版本的源碼,講解 select 訪問 Channel 在編譯期和運行時的底層原理——select 編譯器優化用到的 src/cmd/compile/internal/walk/select.go 的 walkSelectCases() 函數 ⌘ [Read more](https://www.readfog.com/a/1690250169407344640) 2023-01-09T02:46:28Z **Go1-20 新特性:context 支持自定義取消原因**
問題熟悉 Go 語言的同學都知道,context 包只對外提供了兩種取消原因 context.DeadlineExceeded 和 context.Canceled,不支持自定義原因,就像下面這樣:func main() {    // Pass a context with a timeout to tell a blocking function that it    // should ab ⌘ [Read more](https://www.readfog.com/a/1690520742267031552) 2023-01-09T03:38:43Z **evio 原理解析**
圖片拍攝於2022年11月26日 大屋頂之前分析過go自帶的netpoll,以及自建的網絡框架gnet。這類框架還有:evio、gev、nbio、cloudwego/netpoll(字節的)爲什麼會出現這麼多自建框架? 我覺得逃不過三點,自帶的 netpoll 滿足不了一些特殊場景。 其他實現設計存在侷限性,存在優化空間。 程序員都喜歡自己造輪子。 另外,這類框架都是基於 sy ⌘ [Read more](https://www.readfog.com/a/1690524029522382848) 2023-01-09T12:09:01Z **一文讀懂 Go Http Server 原理**
hello 大家好呀,我是小樓,這是系列文《Go 底層原理剖析》的第二篇,依舊是分析 Http 模塊,話不多說,開始。從一個 Demo 入手俗話說萬事開頭難,但用 Go 實現一個 Http Server 真不難,簡單到什麼程度?起一個 Server,並且能響應請求,算上包名、導入的依賴,甚至空行,也就只要 15 行代碼:package mainimport ( "io" "net/http")fu ⌘ [Read more](https://www.readfog.com/a/1690556134200545280) 2023-01-09T12:14:21Z **瞭解 Go 中的 defer**
簡介------Go 有許多其他編程語言中常見的控制流關鍵字,如 if、switch、for 等。有一個關鍵詞在大多數其他編程語言中都沒有,那就是  defer ,雖然它不太常見,但你很快就會發現它在你的程序中是多麼有用。defer 語句的主要用途之一是清理資源,如打開的文件、網絡連接和 數據庫句柄 [1]。當你的程序使用完這些資源後,關閉它們很重要,以避免耗盡程序的限制,並允許其他程序訪問這些 ⌘ [Read more](https://www.readfog.com/a/1690556470119206912) 2023-01-11T02:54:26Z **Golang vs Rust 服務端編程應該選擇哪種語言**
爲服務端編程選擇一種語言應該基於你的長期目標和項目的要求,因此,盲目地問我應該僱用 Go 開發人員還是應該選擇 Rust 進行開發並不能幫助你解決問題。然而,如果你發現自己陷入了困境,那麼這篇文章將爲你解惑。下面讓我們開始吧。Go 是一種靜態類型的、AOT 編譯的語言,而 Rust 是一種靜態、強類型與 AOT 編譯的語言,也是一種多範式、高級和通用的語言。讓我們從多方位來評估這兩種語言。1. G ⌘ [Read more](https://www.readfog.com/a/1690702436996583424) 2023-01-11T03:06:11Z **發現 conc 併發庫一個有趣的問題**
圖片拍攝於 2022 年 02 月 04 日 衢州開化老家 下週回家了上週看到一個新庫 conc, better structured concurrency for go.這個庫的目標是:更難出現 goroutine 泄漏 優雅處理 panic 使併發的代碼更易讀 我們一條條細說。Make it harder to leak goroutinesgoroutine 泄漏還是很 ⌘ [Read more](https://www.readfog.com/a/1690703176690405376) 2023-01-13T03:08:24Z **聊聊 Go 與 TLS 1-3**
除了一些綜述類文章和譯文,我的文章選題多來源於實際工作和學習中遇到的問題。這次我們來聊聊近期遇到一個問題:如何加快基於 TLS 安全通信的海量連接的建連速度?TLS(Transport Layer Security) 傳輸安全層的下面是 TCP 層,我們首先可能會想到的是優化內核有關 TCP 握手的相關參數來快速建立 TCP 連接,比如:net.ipv4.tcpmaxsynbacklog n ⌘ [Read more](https://www.readfog.com/a/1690884509797552128) 2023-01-16T02:16:51Z **Go 底層探索 -一-: 編譯器**
介紹\-\-\-\-\- @注: 以下內容來自本人學習《Go 語言底層原理剖析》書中的摘要信息。另外這本書中使用的Go是老版本,我使用的版本是Go1.18有時候源碼路徑可能會不一樣編譯器是一個大型且複雜的系統,一個好的編譯器會很好地結合形式語言理論、算法、人工智能、系統設計、計算機體系結構及編程語言理論。Go語言的編譯器遵循了主流編譯器採用的經典策略及相似的處理流程和優化規則(例如經典的遞歸下降的語法解析 ⌘ [Read more](https://www.readfog.com/a/1691153057349472256) 2023-01-16T02:25:32Z **瞭解 Go 中的 init**
簡介------在 Go 中,預定義的 init() 函數設置了一段代碼,在你的包的任何其他部分之前運行。這段代碼將在包被導入(點擊跳轉查看)後立即執行,當你需要你的應用程序在一個特定的狀態下初始化時,例如你有一個特定的配置或一組資源,你的應用程序需要用它來啓動。它也可以在導入副作用時使用,這是一種通過導入特定包來設置程序狀態的技術,經常被用於 register 一個包和另一個包,以確保程序考慮 ⌘ [Read more](https://www.readfog.com/a/1691153603065122816) 2023-01-17T03:49:12Z **「Go 框架」深入理解 iris 框架的路由底層結構**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。iris 框架號稱是最快的 web 框架。今天就來深入研究下 iris 框架路由的底層實現原理。那爲什麼需要深入瞭解 web 框架的路由呢?路由是 web 框架的核心。在業務開發中,我們在使用框架時,基本就是在註冊路由、使用中間件、然 ⌘ [Read more](https://www.readfog.com/a/1691249464186081280) 2023-01-18T03:01:39Z **10 秒改 struct 性能直接提升 15-,產品姐姐都誇我好棒**
struct 結構體的字段順序有什麼講究?您可能不知道,通過簡單地重新排序結構體中的字段,可以極大地提高 Go 程序的速度和內存使用率!難以置信吧?讓我們來看個例子。例子--ep:type BadStruct struct {    age          uint8    IdCardNumber uint64    DateOfBirth  uint16}type GoodStruct st ⌘ [Read more](https://www.readfog.com/a/1691337069427789824) 2023-01-19T03:23:26Z **「Go 框架」剖析 iris 中錯誤碼路由的運行機制**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。在 iris 中,除了能夠指定正常的請求路由外,還能根據 http 的響應錯誤碼指定具體的請求處理函數,以便針對具體的錯誤做出不同的響應。例如,當響應狀態碼是 400 時,該如何處理該請求;當響應狀態碼是 500 時,又該如何處理該請 ⌘ [Read more](https://www.readfog.com/a/1691429037631705088) 2023-01-29T02:38:17Z **「Go 進階」如何優雅接入多個遠程配置中心?**
本文基於 viper 實現了 apollo 多實例快速接入,授人以漁,帶着大家讀源碼,詳解實現思路,封裝成自己的工具類並且開源。 前言--viper 是適用於 go 應用程序的配置解決方案,這款配置管理神器,支持多種類型、開箱即用、極易上手。本地配置文件的接入能很快速的完成,那麼對於遠程 apollo 配置中心的接入,是否也能很快速完成呢?如果有多個 apollo 實例都需要接入,是否能支持 ⌘ [Read more](https://www.readfog.com/a/1692332166026989568) 2023-01-30T03:03:54Z **聊聊併發庫 conc**
上個月 sourcegraph 放出了 conc[1] 併發庫,目標是 better structured concurrency for go, 簡單的評價一下每個公司都有類似的輪子,與以往的庫比起來,多了泛型,代碼寫起來更優雅,不需要 interface, 不需要運行時 assert, 性能肯定更好我們在寫通用庫和框架的時候,都有一個原則,併發控制與業務邏輯分離,背離這個原則肯定做不出通用庫整 ⌘ [Read more](https://www.readfog.com/a/1692424375085666304) 2023-01-30T03:10:13Z **用構建標籤定製 Go 二進制文件**
簡介--在 Go 中,構建標籤 或 構建約束 是添加到一段代碼中的標識符,它決定了該文件在 build 過程中何時應被包含在一個包中。這允許你從同一源代碼中構建不同版本的 Go 應用程序,並以快速和有組織的方式在它們之間進行切換。許多開發者使用構建標籤來改善構建跨平臺兼容的應用程序的工作流程,例如需要修改代碼以考慮不同操作系統之間的差異的程序。構建標籤還可用於集成測試 [1],允許你在集成代碼和帶 ⌘ [Read more](https://www.readfog.com/a/1692424772082831360) 2023-01-30T03:28:49Z **Go 語言實現的可讀性更高的併發神庫 conc**
前言\-\- 哈嘍,大家好,我是 asong;前幾天逛 github 發現了一個有趣的併發庫 - conc,其目標是: 更難出現 goroutine 泄漏 處理 panic 更友好 併發代碼可讀性高 從簡介上看主要封裝功能如下: 對waitGroup進行封裝,避免了產生大量重複代碼,並且也封裝 recover,安全性更高 提供panics.Catcher封裝r ⌘ [Read more](https://www.readfog.com/a/1692425942563131392) 2023-01-30T15:24:43Z **這些關於 Golang timezone 時區的坑, 我已經幫你踩過了**
原文鏈接: https://tangx.in/posts/2023/01/09/golang-timezone-issue/Golang 中一些不太注意的時區問題time/tzdata 庫------------------Golang 內置的一個時區文件。可以在程序中任意位置被導入。導入後, 如果程序 找不到本地 時區文件, 就會使用該庫的數據。 本地 指的是 運行環境, 可能是實際的 ⌘ [Read more](https://www.readfog.com/a/1692470983186812928) 2023-01-31T03:13:10Z **「Go 框架」深入理解 web 框架的中間件運行機制**
大家在使用 iris 框架搭建 web 系統時,一定會用到中間件。那麼你瞭解中間件的運行機制嗎?你知道爲什麼在 iris 和 gin 框架的請求處理函數中要加 c.Next() 函數嗎?本文就和大家一起探究該問題的答案。一、中間件的基本使用----------在 web 開發中,中間件起着很重要的作用。比如,身份驗證、權限認證、日誌記錄等。以下就是各框架對中間件的基本使用。1.1 iris 框架中 ⌘ [Read more](https://www.readfog.com/a/1692515554890452992) 2023-01-31T14:41:04Z **Go 底層探索 -二-: 字符串**
介紹\-\-\-\-\- @注: 以下內容來自《Go 語言底層原理剖析》書中的摘要信息,本人使用版本 (Go1.18) 與書中不一致,源碼路徑可能會有出入。字符串在編程語言中無處不在,程序的源文件本身就是由衆多字符組成的,在程序開發中的存儲、傳輸、日誌打印等環節,都離不開字符串的顯示、表達及處理。因此,字符與字符串是編程中最基礎的學問。不同的語言對於字符串的結構、處理有所差異。1.1 字符串長度在編程語言 ⌘ [Read more](https://www.readfog.com/a/1692558833897017344) 2023-01-31T14:40:37Z **Go 底層探索 -三-: 切片**
@注: 以下內容來自《Go 語言底層原理剖析》、《Go 語言設計與實現》書中的摘要信息,本人使用版本 (Go1.18) 與書中不一致,源碼路徑可能會有出入。介紹-----切片是Go語言中非常常用的數據類型之一,使用方式和數組一樣,但是其長度並不固定,我們可以向切片中追加元素,它會在容量不足時自動擴容。1.1 聲明在 Go 語言中,切片類型的聲明方式與數組有一些相似,不過由於切片的長度是動態的, ⌘ [Read more](https://www.readfog.com/a/1692558805104168960) 2023-02-01T08:52:20Z **爲什麼 Go 不支持 []T 轉換爲 []interface**
在 Go 中,如果 interface{} 作爲函數參數的話,是可以傳任意參數的,然後通過類型斷言來轉換。舉個例子:package mainimport "fmt"func foo(v interface{}) {    if v1, ok1 := v.(string); ok1 {        fmt.Println(v1)    } else if v2, ok2 := v.(int); o ⌘ [Read more](https://www.readfog.com/a/1692627490449756160) 2023-02-06T02:42:54Z **瞭解 Go 中的指針**
簡介------當你用 Go 編寫軟件時,你會編寫函數和方法。你將數據作爲 參數 傳遞給這些函數。有時,函數會需要一個數據的本地拷貝,你希望原始數據保持不變。例如,如果你是一家銀行,你有一個函數可以根據用戶選擇的儲蓄計劃來顯示他們的餘額變化,你不想在客戶選擇計劃之前改變他們的實際餘額,而只想用它來做計算。這被稱爲 按值傳遞,因爲你是在向函數發送變量的值,而不是變量本身。其他時候,你可能希望函數能 ⌘ [Read more](https://www.readfog.com/a/1693057232978153472) 2023-02-06T08:16:58Z **slog:Go 官方的結構化日誌包開發的怎麼樣了?該如何使用?**
你好,我是小四,你情商高,也可以叫我四哥~熟悉 Go 的同學都知道 Go 語言標準庫 log 有許多痛點,比如沒有日誌分級、沒有結構化(沒有 JSON 格式)、擴展性差等,爲了解決這些問題 Go 官方推出了結構化日誌包 slog,目前這個庫正在開發階段,已經進入了實驗庫:golang.org/x/exp/slog,目前版本是 v0.0.0。這篇文章我們就來看下 slog 包怎麼用?安裝使用下面的命 ⌘ [Read more](https://www.readfog.com/a/1693078249896251392) 2023-02-08T03:38:37Z **goroutine 已啓動,啥時候停,不確定 Go mistakes【譯】**
Goroutines 上手成本低。如此輕鬆加愉快,我們一開始可能沒有計劃關於何時停止 goroutine,這可能導致泄漏。不知道何時停止 goroutine 是一個設計問題,也是 Go 中常見的併發錯誤。讓我們瞭解爲什麼以及如何防止它。首先,讓我們量化一下 goroutine 泄漏意味着什麼。在內存方面,goroutine 以最小 2KB 的堆棧大小開始,可以根據需要增長和縮小(64 位的最大堆棧 ⌘ [Read more](https://www.readfog.com/a/1693241931267674112) 2023-02-08T03:36:46Z **gops - 雲原生環境下診斷程序的好幫手**
gops 是一個 Google 開源的可列出和診斷系統上當前運行的 go 進程的命令行工具,配合 agent,可以用來很方便的診斷運行中的 go 程序。安裝go get github.com/google/gops// 或者go install github.com/google/gops使用gops 本身可以查看所有 go 程序的進程,如果一個程序使用了 agent,gops 可以報告更多的信息 ⌘ [Read more](https://www.readfog.com/a/1693241814905098240) 2023-02-09T03:37:35Z **巧用 Golang 泛型,簡化代碼編寫**
作者 \| 百度小程序團隊導讀 本文整理了很多的泛型應用技巧,結合具體的實際代碼示例,特別是很多直接對 Go 語言內置的類庫的實現進行改造,再通過兩者在使用上直觀對比,幫助大家對泛型使用思考上提供了更多思路,定會幫助大家在應用泛型能力上有很多的提升與啓發。01前言泛型功能是 Go 語言在 1.18 版本引入的功能,可以說是 Go 語言開源以來最大的語法特性變化,其改動和影響都很大, 所以整個版本的開 ⌘ [Read more](https://www.readfog.com/a/1693332463869333504) 2023-02-10T04:14:16Z **怎麼把自己造的輪子發佈到 Go Module 上**
我們在開發 Go 項目時,經常會使用到一些外部依賴包。它們一般都是通過形如go get example.com/xxx的命令形式獲取到本地使用。本着開源精神,如果我們想將自己開發的包共享出去,讓其他人也能使用go get命令獲取到它們,應該如何做呢?本文將以開源至 Github 平臺爲例,展示其流程。建立倉庫----首先,在 github 平臺建立倉庫,設置想要開源的 Go 庫名。這裏將項目名取爲 ⌘ [Read more](https://www.readfog.com/a/1693425368456859648) 2023-02-13T10:19:20Z **縮減 Golang 編譯後文件大小的三種方法**
測試機器:Mac OS 10.15 Golang 版本:1.15.2 爲什麼要縮減 Golang 編譯後的文件大小呢?不縮減可不可以呢。正常來說一般服務器硬盤資源相對來說都比較充足,但如果類似樹莓派上的一些設備上,硬盤資源相對來說就不是那麼充足,這時就需要我們斤斤計較文件大小了。首先,我們先對比一下兩段 Hello World 代碼package mainimport "fmtfunc ⌘ [Read more](https://www.readfog.com/a/1693720127212720128) 2023-02-13T10:39:53Z **Go 語言怎麼使用 zap 日誌庫?**
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹我們在之前的文章中介紹過標準庫 log 包的使用方式,它雖然使用方便,但是它支持的功能比較簡單。本文我們介紹 uber 開源的日誌庫 zap,首先使用 Gin 框架構建一個 Web 應用,然後通 ⌘ [Read more](https://www.readfog.com/a/1693721420312449024) 2023-02-14T02:55:05Z **「每週譯 Go」在 Go 中定義結構體**
簡介------圍繞具體的細節建立抽象,是編程語言能給開發者的最大工具。結構體使我們可以談論 Address 而不是通過描述 Street, City, 或 PostalCode 字符串來進行推斷。它們作爲文檔(點擊跳轉查看哦)的一個自然紐帶,致力於告訴未來的開發者(包括我們自己)哪些數據對我們的 Go 程序是重要的,以及未來的代碼應該如何正確使用這些數據。結構體可以用幾種不同的方式來定義和使用 ⌘ [Read more](https://www.readfog.com/a/1693782774736064512) 2023-02-15T06:12:25Z **在 Go 中實施簡潔架構**
已經有很多關於 簡潔架構 [1] 的文章了。它的主要價值在於能夠維護無副作用的領域層,使我們能夠不需要利用沉重的 mock 來測試核心業務邏輯。 通過寫一個無需依賴的核心領域邏輯,以及外部適配器 (成爲它的數據庫存儲或者 API 層) 來實現的。這些適配器依賴於領域,而不是領域依賴適配器。在這篇文章,我們會看一下簡潔架構是如何實現一個簡單的 Go 項目。我們會提及一些額外的主題,例如容器化以及用 ⌘ [Read more](https://www.readfog.com/a/1693885786352619520) 2023-02-15T06:15:04Z **必須知道的 17 個 Go 開發庫**
包含各種使用場景的 Go 第三方列表。隨着時間的推移,Go 語言愛好者已經創建並共享了許多 Go 框架和庫。這些庫有不同的功能,從微服務開發到構建 web 應用程序!備註:在 Go 語言中我們都稱第三方庫爲 package(包)。配置文件處理庫配置文件通常以各種格式編寫,如 JSON 和 YAML。Go 有一個非常有用的包,它使讀取和寫入各種格式的配置文件成爲小菜一碟。1、Viper:這是一個關於 ⌘ [Read more](https://www.readfog.com/a/1693885953509265408) 2023-02-15T06:14:52Z **Go 語言標準庫 net-http 及 go-resty 庫使用**
net/http 介紹Go 語言標準庫 net/http 自身足夠簡單且性能優越,Go 語言的很多 web 框架號稱多麼優秀,都是基於強大的 net/http 庫提供了可擴展性的功能,例如:靜態路由、安全和用戶認證、實時通信等。net/http 庫提供了 http 客戶端和服務端的實現,下面我們通過簡單案例來嘗試下。HTTP 服務端基於 net/ http 實現服務端的用法,通過調用 Listen ⌘ [Read more](https://www.readfog.com/a/1693885940917964800) 2023-02-15T06:36:31Z **寫給 go 開發者的 gRPC 教程 - 攔截器**
gRPC的攔截器和其他框架的攔截器(也稱 middleware)作用是一樣的。利用攔截器我們可以在不侵入業務邏輯的前提下修改或者記錄服務端或客戶端的請求與響應,利用攔截器我們可以實現諸如日誌記錄、權限認證、限流等諸多功能上一篇提到gRPC的通信模式分爲unary和streaming幾種模式,攔截器也分爲兩種:unary interceptors和streaming interceptors ,兩 ⌘ [Read more](https://www.readfog.com/a/1693887303052791808) 2023-02-15T06:46:50Z **如何使用 Delve 和 eBPF 更快地調試 Go 程序**
前言此文章將解釋如何使用 Delve[1] 跟蹤 Go 程序,以及 Delve 如何利用 eBPF 在後臺優化效率和速度。Delve 的目標是爲開發人員提供愉快且高效的 Go 調試體驗。因此,本文重點介紹了我們如何優化函數跟蹤子系統,以便您可以更快地檢查程序並找到根本原因分析。Delve 的跟蹤實現有兩個不同的後端,一個是基於 ptrace 的,另一個使用 eBPF。如果您不熟悉任何這些術語,請不 ⌘ [Read more](https://www.readfog.com/a/1693887951864434688) 2023-02-15T07:03:38Z **golang 中 channel 的詳細使用、使用注意事項及死鎖分析**
什麼是 channel 管道--------------它是一個數據管道,可以往裏面寫數據,從裏面讀數據。channel 是 goroutine 之間數據通信橋樑,而且是線程安全的。channel 遵循先進先出原則。寫入,讀出數據都會加鎖。channel 可以分爲 3 種類型:只讀 channel,單向 channel 只寫 channel,單向 channel 可讀可寫 channe ⌘ [Read more](https://www.readfog.com/a/1693889009424633856) 2023-02-15T15:31:08Z **Go1-20 實驗:內存 Arenas VS 傳統內存管理**
注意 Go arenas 是一個實驗性功能。API 和實現完全不受支持,Go 團隊不保證兼容性,也不保證在任何未來版本中繼續存在。 請通過這個 github 討論區 [1] 來了解更多信息。簡介------Go 1.20 引入了一個實驗性的內存管理概念 “arenas”,可以用來提高 Go 程序的性能。在本博客文章中,我們將探討:什麼是 arenas 它們是如何工作的 ⌘ [Read more](https://www.readfog.com/a/1693920938080440320) 2023-02-16T03:31:21Z **寫給 go 開發者的 gRPC 教程 - 錯誤處理**
基本錯誤處理首先回顧下 pb 文件和生成出來的 client 與 server 端的接口service OrderManagement { rpc getOrder(google.protobuf.StringValue) returns (Order);}type OrderManagementClient interface { GetOrder(ctx context.Context, ⌘ [Read more](https://www.readfog.com/a/1693966250594635776) 2023-02-17T04:03:26Z **Ristretto 簡介:一個高性能 GO 緩存**
這個博客登上了 Golang subreddit[1] 的頂部,並且在 Hacker News[2] 的 trending 上排在前十位。一定要在那裏參與討論,並通過給我們一個 star[3],表達對我們的喜歡。經過六個月的研發,我們自豪地宣佈緩存 Ristretto[4]:一個高性能、併發、可設置內存上限的 Go 緩存的初始版本。他是抗爭用、擴展性好、提供穩定的高命中率。前言這一切都始於 Dgr ⌘ [Read more](https://www.readfog.com/a/1694058865617899520) 2023-02-17T04:10:47Z **「Go 框架」深入理解 iris 中的 mvc 之原理篇**
一、mvc 的基本使用-----------在 iris 中,還封裝了 mvc 包,該包可以讓開發者快速的搭建出基於 mvc(model-view-controller)分層的業務系統。其基本使用如下:package mainimport ( "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/context" "github.co ⌘ [Read more](https://www.readfog.com/a/1694059327950786560) 2023-02-20T03:05:25Z **「每週譯 Go」在 Go 中定義方法**
簡介------函數 (點擊可跳轉查看)允許你將邏輯組織成可重複的程序,每次運行時可以使用不同的參數。在定義函數的過程中,你常常會發現,可能會有多個函數每次對同一塊數據進行操作。Go 可以識別這種模式,並允許您定義特殊的函數,稱爲方法,其目的是對某些特定類型(稱爲接收器)的實例進行操作。將方法添加到類型中,不僅可以傳達數據是什麼,還可以傳達如何使用這些數據。定義一個方法----------定義一 ⌘ [Read more](https://www.readfog.com/a/1694327006291922944) 2023-02-20T03:10:14Z **【譯】Go 語言:深入探究 array 與 slice**
你好,我是小四,你情商高,也可以叫我四哥~這篇文章我們將討論 Go 語言中數組與切片 (slice),深入探究它們的內部結構以及爲什麼它們表現不一樣,即使它們能做類似的事情。我們將從以下幾個方面討論數組和切片的表現差異:默認值和零值 聲明和初始化數組和切片 數組和切片的值部分 操作數組和切片 關於切片的潛在陷阱 代碼優化的小技巧 默認值和零值Go 語言中,聲明變 ⌘ [Read more](https://www.readfog.com/a/1694327310006718464) 2023-02-22T11:47:50Z **Go1-20 arena 能手動管理內存了,怎麼用?**
大家好,我是煎魚。最近 Go1.20 中的手動管理內存受到了很多人的關注。衆所周知,Go 是一門帶垃圾回收(GC)的編程語言,可以進行自動的內存申請、釋放等內存操作。帶 GC 能簡化編程時的心智成本,也保證了內存的安全。我們說 “一般”,也就是有例外。人們說六個,一般都有七個。Go 的例外就出現了。Go1.20 arena------------新版本 Go1.20,基於 Google 自身的需求 ⌘ [Read more](https://www.readfog.com/a/1694541067905503232) 2023-02-23T03:03:25Z **Go 語言的垃圾回收**
Go [ = v1.5] 的新垃圾回收器是一種併發的三色標記清除回收器,這個想法最早是由 Dijkstra 在 1978 [1] 年提出的。Go 團隊一直在密切關注並改進 Go 語言的垃圾回收器。從每 50 毫秒一次的 10 毫秒 STW 暫停到每次 GC 有兩個 500μs 的 STW 暫停,整個改進過程可以在這裏 [2] 找到。長期從事 Go 開發,我一直對其性能感到畏懼,因此我決定深入 ⌘ [Read more](https://www.readfog.com/a/1694598671624146944) 2023-02-27T03:36:07Z **Go 語言跨平臺文件監聽庫 fsnotify 怎麼使用?**
01 介紹Go 語言作爲靜態編譯型語言,每次修改配置文件後,我們都需要重新編譯,修改的配置信息纔可以生效,而動態編譯型語言修改配置文件可以自動生效,相對來說更方便一些。但是,我們可以使用三方開源庫 fsnotify,這是一款非常流行的文件系統監聽庫,很多開源的三方庫也都使用該庫實現監聽文件變更,比如我們之前介紹的非常流行的管理配置信息開源庫 viper。02 fsnotify 源碼解讀NewWat ⌘ [Read more](https://www.readfog.com/a/1694963116840947712) 2023-02-27T03:35:43Z **如何用 go 實現一個 ORM**
本期作者洪勝傑B 端技術中心高級開發工程師爲了提高開發效率和質量,我們常常需要 ORM 來幫助我們快速實現持久層增刪改查 API,目前 go 語言實現的 ORM 有很多種,他們都有自己的優劣點,有的實現簡單,有的功能複雜,有的 API 十分優雅。在使用了多個類似的工具之後,總是會發現某些點無法滿足解決我們生產環境中碰到的實際問題,比如無法集成公司內部的監控,Trace 組件,沒有 database ⌘ [Read more](https://www.readfog.com/a/1694963091901616128) 2023-02-27T03:43:58Z **一文喫透 Go 內置 RPC 原理**
hello 大家好呀,我是小樓,這是系列文《Go 底層原理剖析》的第三篇,依舊分析 Http 模塊。我們今天來看 Go 內置的 RPC。說起 RPC 大家想到的一般是框架,Go 作爲編程語言竟然還內置了 RPC,着實讓我有些喫鯨。從一個 Demo 入手爲了快速進入狀態,我們先搞一個 Demo,當然這個 Demo 是參考 Go 源碼 src/net/rpc/server.go,做了一丟丟的修改。首先 ⌘ [Read more](https://www.readfog.com/a/1694963611260260352) 2023-02-28T09:44:54Z **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](https://www.readfog.com/a/1695076915760697344) 2023-03-01T15:52:05Z **深入理解 go sync-Con**
在 go 的標準庫中,提供了 sync.Cond 這個併發原語,讓我們可以實現多個 goroutine 等待某一條件滿足之後再繼續執行。 它需要配合 sync.Mutex 一起使用,因爲 Cond 的 Wait 方法需要在 Mutex 的保護下才能正常工作。 對於條件變量,可能大多數人只是知道它的存在,但是用到它的估計寥寥無幾,因爲很多併發場景的處理都能使用 chan 來實現, 而且 chan 的 ⌘ [Read more](https://www.readfog.com/a/1695190613894467584) 2023-03-02T11:55:34Z **用 Go 語言 0 代碼 10 分鐘完成一個學生管理系統帶頁面,私活必備**
大家好,我是小熊。今天到明天就有好多學生朋友開學了,很多人痛苦不堪精神恍惚捶胸頓足,作爲過來人勸大家一定要看開,畢竟等以後工作了每週的週一都會這樣的。# 不止週一,是每個工作日#今天給大家介紹下各個沒聽過的功能。回憶往昔----上次給大家講了 5 分鐘啓動一個項目,使用到的是go-gin-api這個開源項目。他可能給我們提高很多的開發效率,來看看他寫業務代碼要幾步。數據庫寫 DDL 創建表結構 ⌘ [Read more](https://www.readfog.com/a/1695266329970446336) 2023-03-03T07:21:50Z **Go 應用服務疑似內存泄露問題排查**
作者:SFLYQ https://juejin.cn/post/7195857732846698557背景爲了保障業務的可用性,增加應用服務請求依賴服務(grpc、http)的熔斷降級策略,避免依賴服務不可用的情況下,出現級聯服務故障產生雪崩,通過熔斷降級儘可能把影響縮放到最小。因此需要在 go 應用服務中接入熔斷組件,組件我們選擇了:阿里開源的 sentinel circuitbrea ⌘ [Read more](https://www.readfog.com/a/1695339705425563648) 2023-03-06T02:24:45Z **Go 語言開源 RPC 服務治理框架**
介紹--RPCX 是當前最流行的 Go 生態圈的微服務框架之一,很多大廠和創業公司都在使用,並且服務端無需額外配置,RPCX 也同時支持 HTTP 調用,這樣其它編程語言都可以調用 RPCX 服務, 是目前性能最好的 RPC 框架之一。功能特性----• 簡單易用:易於入門, 易於開發, 易於集成, 易於發佈, 易於監控 • 高性能:性能遠遠高於 Dubbo、Motan、Thrift 等框架 ⌘ [Read more](https://www.readfog.com/a/1695592805719707648) 2023-03-06T02:59:33Z **爲什麼 Go 語言 struct 要使用 tags**
在 Go 語言中,struct 是一種常見的數據類型,它可以用來表示複雜的數據結構。在 struct 中,我們可以定義多個字段,每個字段可以有不同的類型和名稱。除了這些基本信息之外,Go 還提供了 struct tags,它可以用來指定 struct 中每個字段的元信息。在本文中,我們將探討爲什麼 Go 語言中需要使用 struct tags,以及 struct tags 的使用場景和優勢。str ⌘ [Read more](https://www.readfog.com/a/1695594994861182976) 2023-03-06T11:00:34Z **Go 包管理講解**
大部分編程語言都有其代碼組織方式,以方便管理我們所開發的代碼,比如PHP的命名空間(namespace),Java的package,JavaScript的module;Go 語言也有自己的代碼組織方式:包 (package)。Go 語言包管理歷史----------Go語言包管理歷史主要有以下幾個階段:GOPATH時代:項目放在GOPATH環境變量所配置的目錄下的src目錄中。 vendor ⌘ [Read more](https://www.readfog.com/a/1695625258172780544) 2023-03-07T03:22:16Z **Go 高性能 - 打印調用堆棧**
概述在工程代碼中需要在異常場景打印相應的日誌,記錄重要的上下文信息。如果遇到 panic 或 error 的情況, 這時候就需要詳細的 堆棧信息 作爲輔助來排查問題,本小節就來介紹兩種常見的獲取 堆棧信息 方法, 然後對兩種方法進行基準測試,最後使用測試的結果進行性能對比並分析差異。runtime.Stack通過標準庫提供的 runtime.Stack 相關 API 來獲取。示例--package ⌘ [Read more](https://www.readfog.com/a/1695687021629116416) 2023-03-07T10:35:02Z **寫給 go 開發者的 gRPC 教程 - metadata**
導語 和在普通HTTP請求中一樣,gRPC 提供了在每一次 RPC 中攜帶上下文的結構:metadata。在 Go 語言中,它與context.Context緊密結合,幫助我們實現服務端與客戶端之間互相傳遞信息什麼是 metadata?---------------gRPC 的 metadata 簡單理解,就是 HTTP Header  中的 key-value 對metadata 是 ⌘ [Read more](https://www.readfog.com/a/1695714248843431936) 2023-03-07T10:35:55Z **一文帶你瞭解 Go mod!**
什麼是 Go mod? go mod 是 Go 語言的模塊管理工具, 可用來代替傳統的 GOPATH。go mod 和 GOPATH 的區別有哪些?go mod 的代碼開發不侷限於某一個目錄,GOPATH 的代碼開發必須在 GOPATH 的 src 目錄下 go mod 的依賴無需手動管理,可執行一條命令後自動管理依賴, GOPATH 的包依賴需要一個一個解決 go mod 在使用之前 ⌘ [Read more](https://www.readfog.com/a/1695714303660888064) 2023-03-07T13:35:33Z **可觀察性與性能在 go 中的實踐**
先測量“過早的優化是萬惡之源”——Donald KnuthGo 有兩個在性能調優方面非常寶貴的工具:一個分析器和一個基準測試工具。探查器幫助找到問題點,基準顯示優化的結果。有關這些工具的介紹,請參閱 Dave Cheney 的 How to write benchmarks in Go 和 Russ Cox 的 Profiling Go Programs 。下面是我在基準測試和分析器中發現的幾種具 ⌘ [Read more](https://www.readfog.com/a/1695725606146248704) 2023-03-08T03:52:20Z **【譯】Go 語言:使用 Singleflight 優化你的代碼**
你好,我是小四,你情商高,也可以叫我四哥~介紹有很多方法可以優化代碼以達到提高程序運行效率,減少進程數就是其中之一。在這篇文章中,我們將學習如何通過使用 Go 語言的 Singleflight 包減少重複的進程來優化 Go 代碼。問題假設你有一個 web 應用,每秒鐘處理 10 個請求。根據數據觀察其中一些請求是重複的,意味着可以減少請求的進程。從上圖可以看出,user1 和 user2 請求相同 ⌘ [Read more](https://www.readfog.com/a/1695779509897367552) 2023-03-08T13:13:28Z **在 Gin 中使用中間件進行全局錯誤處理**
3 自定義錯誤結構首先自定義如下錯誤結構體,包含 code、msg 和 data,data 用以提供附加的錯誤信息,比如提示 300 參數錯誤時 data 可提示具體的參數錯誤信息。按照 golang 的接口實現規則,只要 MyError 結構體實現了 Error() string 方法就可被視作實現了標準 error 接口。package errorstype MyError struct { ⌘ [Read more](https://www.readfog.com/a/1695814813595308032) 2023-03-08T13:55:09Z **Go 高性能 - 逃逸分析**
逃逸分析Go 語言的編譯器使用 逃逸分析 決定哪些變量分配在棧上,哪些變量分配在堆上。在棧上分配和回收內存很快,只需要 2 個指令: PUSH + POP, 也就是僅需要將數據複製到內存的時間,而堆上分配和回收內存,一個相當大的開銷是 GC。特性--• 指向 棧 對象的指針不能分配堆上 (避免懸掛指針) • 指向 棧 對象的指針在對象銷燬時必須被同時銷燬 (避免懸掛指針和內存泄露) 例 ⌘ [Read more](https://www.readfog.com/a/1695817435372949504) 2023-03-08T13:54:43Z **Go 程序的生前死後**
作者: 絕了 https://juejin.cn/post/7202149834362585145最近想寫一篇 GC 的文章,寫着寫着發現沒有 GMP 調度模型和 Memory Model 的知識,gc 就很難寫下去,然後就又去看 GMP 模型,然後發現 GMP 的起點還是得看 g0、m0 這幾個關鍵數據,這幾個數據又是在程序啓動時初始化的,然後發現 GC 和 Memory Model ⌘ [Read more](https://www.readfog.com/a/1695817408636358656) 2023-03-09T03:34:54Z **golang 源碼分析:自定義 proto 插件**
在使用 protoc 的時候,可以通過指定不同的插件來生成不同的代碼,它的參數統一是 xxout 結尾的,制定了插件參數,就會到 path 下搜索 protoc-gen-xx 的插件。比如 protoc 通過 --fooout 搜索插件 可執行文件 protoc-gen-foo, 也可使用參數 protoc --plugin=protoc-gen-foo=/path/to/prot ⌘ [Read more](https://www.readfog.com/a/1695869010438098944) 2023-03-09T04:01:24Z **Go 語言中的嵌入【第二部分】:接口嵌入接口**
你好,我是小四,你情商高,也可以叫我四哥~接口嵌入接口在一個接口裏面嵌入另一個接口,是 Go 語言裏最簡單的一種嵌入方式,因爲接口只定義了抽象能力,並沒有爲類型定義新的數據和行爲。我們先看 Effective Go[1] 裏列的示例,一個衆所周知的 Go 標準庫中嵌入接口的示例,給出 io.Reader 和 io.Writer 接口:type Reader interface {    Read( ⌘ [Read more](https://www.readfog.com/a/1695870677010190336) 2023-03-09T04:00:42Z **Go 語言中的嵌入【第一部分】:結構體嵌入結構體**
你好,我是小四,你情商高,也可以叫我四哥~Go 語言並不支持傳統意義上的繼承,相反,它提倡通過組合來擴展類型的功能。這並不是 Go 所特有的概念,繼承之上的組合是 OOP 的一個衆所周知的原則,在《設計模式》一書的第一章就有介紹。Embedding(嵌入) 是 Go 語言一個重要的特性,有了它使得組合更加方便、更有用。雖然 Go 力求簡單,但某種程度上嵌入增加了語言的複雜度,如果使用不當會導致 b ⌘ [Read more](https://www.readfog.com/a/1695870633626406912) 2023-03-09T03:59:32Z **寫給 go 開發者的 gRPC 教程 - 超時控制**
導言 一個合理的超時時間是非常必要的,它能提高用戶體驗,提高服務器的整體性能,是服務治理的常見手段之一爲什麼要設置超時--------用戶體驗:很多 RPC 都是由用戶側發起,如果請求不設置超時時間或者超時時間不合理,會導致用戶一直處於白屏或者請求中的狀態,影響用戶的體驗資源利用:一個 RPC 會佔用兩端(服務端與客戶端)端口、cpu、內存等一系列的資源,不合理的超時時間會導致 RPC ⌘ [Read more](https://www.readfog.com/a/1695870560040488960) 2023-03-09T12:45:53Z **dynamicgo 開源 :基於原始字節流的高性能 - 動態化 Go 數據處理**
倉庫地址:https://github.com/cloudwego/dynamicgo01背景當前,Thrift 是字節內部主要使用的 RPC 序列化協議,在 CloudWeGo/Kitex 項目中優化和使用後,性能相比使用支持泛型編解碼的協議如 JSON 有較大優勢。但是在和業務團隊進行深入合作優化的過程中,我們發現一些特殊業務場景並不能享受靜態化代碼生成所帶來的高性能:動態反射:動態地 讀 ⌘ [Read more](https://www.readfog.com/a/1695903675112853504) 2023-03-13T06:36:15Z **Go for range 一不下心就掉坑**
前言 for 循環問題,在面試中經常都會被問到,並且在實際業務項目中也經常用到 for 循環,要是沒用好,一不下心就掉坑。下面會挑選幾個經典的案例,一塊來探討下,看看如何避免掉坑,多積累積累採坑經驗。案例一:for + 傳值------------先來到開胃菜,熱熱身~type student struct {  name string  age  int}func main() {  m := ⌘ [Read more](https://www.readfog.com/a/1696242807378907136) 2023-03-13T06:37:43Z **如何在 Go 使用 interface**
簡述--編寫靈活的、可重複使用的、模塊化的代碼對於開發多功能的程序至關重要。以這種方式開發,可以避免在多個地方做同樣的修改,從而確保代碼更容易維護。如何完成這個目標,不同語言有不同的實現方法來完成這個目標。例如,繼承 [1] 是一種常見的方法,在 Java、C++、C# 等語言中都有使用。開發者們也可以通過組合 [2] 實現這個設計目標。組合是一個將多個對象和數據類型組合到一個複雜的結構體中的方 ⌘ [Read more](https://www.readfog.com/a/1696242899475337216) 2023-03-13T13:42:29Z **eCapture 旁觀者支持 Golang tls-https 加密明文捕獲**
前言云原生生態中,golang 語言開發的項目越來越多,例如 Docker 和 K8s、etcd 等。作爲 SRE、RD,偶爾需要在生產環境抓網絡通訊包,用來分析排查故障。很多時候,都是 tls/https 加密協議,如何在不重啓業務保留現場,不改爲自定義 CA 證書的情況下,分析明文通訊內容呢?適用場景eCapture 0.5.0 版本在 2023 年 3 月 12 日發佈,支持了 go 語言編 ⌘ [Read more](https://www.readfog.com/a/1696269623928918016) 2023-03-14T07:48:03Z **Go 中的性能分析和執行跟蹤**
Go 提供了一些優秀的診斷工具來幫助我們深入分析應用程序的執行情況。這篇文章核心關注點是:分析和執行跟蹤器。 這兩個工具都非常重要,它們應該成爲任何對優化感興趣的 Go 開發人員的核心工具集的一部分。 首先,我們來討論下性能分析。性能分析 Profiling------------------分析工具提供了對應用程序執行的洞察力。它使我們能夠解決性能問題、檢測競爭、定位內存泄漏等。這些信息可以通過 ⌘ [Read more](https://www.readfog.com/a/1696337921432457216) 2023-03-14T13:41:34Z **Golang 整潔架構實踐**
作者:donghli,騰訊 PCG 後臺開發工程師 瞭解過 Hex 六邊形架構、Onion 洋蔥架構、Clean 整潔架構的同學可以將本篇文章介紹的實踐方法與自身項目代碼架構對比並互通有無,共同改進。沒了解過上述架構的同學可以學習一種新的架構方法,並嘗試將其應用到業務項目中,降低項目維護成本,提高效率。本文提及的架構主要指項目組織的 “代碼架構”,注意與微服務架構等名詞中的服務架構進行區分。1. ⌘ [Read more](https://www.readfog.com/a/1696360163035942912) 2023-03-15T06:34:09Z **Go 協程池 -2-: 如何實現協程池**
線程池的出現,是因爲頻繁地創建和銷燬線程開銷比較大。通過線程池,一個線程不僅僅是處理一個任務就被銷燬,而是可以處理多個任務,任務被處理完時才被銷燬。下圖是 Java ExecutorService 類的結構:Java ExecutorService協程池的作用是一樣的,實現原理當然也一樣。一個協程池的數據結構,在邏輯上必須 3 類數據:協程池的容量 task pool 任務池 work ⌘ [Read more](https://www.readfog.com/a/1696423869642018816) 2023-03-15T06:33:31Z **Go 協程池 -1-: 線程 vs 協程**
衆所周知,Goroutine(也叫協程) 運行在用戶態,由 Go runtime 管理。而操作系統線程同時處於用戶態和內核態。兩者的差別體現在四個方面:數據結構 創建時的內存佔用 運行時狀態 上下文切換 數據結構對於每個線程,內核中都維護一個 taskstruct 對象,它還有一個名字叫 thread control block,簡稱 TCB。這個結構中記錄了線程當前的 ⌘ [Read more](https://www.readfog.com/a/1696423829062127616) 2023-03-15T06:39:55Z **Go 項目 2 次架構演變,算是入了微服務的門吧!**
作者:Ciusyan https://juejin.cn/post/7203247258850312251一、初見 Dousheng (1)架構思路因爲自己以前是一個Javer,對傳統的MVC三層架構還算比較熟悉,就巨石架構而言,使用MVC的架構方式,模塊還算是比較清晰了。因爲接觸了一門新的語言GoLang,利用一些熟悉的事物過渡到不太熟悉的領域。是我們人性所擅長的。所以在 Doush ⌘ [Read more](https://www.readfog.com/a/1696424232286785536) 2023-03-16T03:11:25Z **Go 語言中部分實現的接口 -技巧-**
你好,我是小四,你情商高,也可以叫我四哥~Go 語言不同於我們所知道的其他語言,比如 Java、C# 等。常常使用鴨子類型處理依賴關係。通過聲明一個本地接口,指定想要依賴的方法,但是不提供具體的實現,就像下面這樣:// Notice that the interface does not even need to be exported// for an outside dependency to ⌘ [Read more](https://www.readfog.com/a/1696501711332544512) 2023-03-16T03:20:50Z **一文搞懂 Go subtest**
本文永久鏈接 [2] - https://tonybai.com/2023/03/15/an-intro-of-go-subtest單元測試 (unit testing)[3] 是軟件開發中至關重要的一環,它存在的意義包括但不限於如下幾個方面:提高代碼質量:單元測試可以確保代碼的正確性、可靠性和穩定性,從而減少代碼缺陷和 bug。 減少迴歸測試成本:在修改代碼時,單元測試可以快速檢查是否影響 ⌘ [Read more](https://www.readfog.com/a/1696502303805247488) 2023-03-16T03:25:46Z **你是否因使用姿勢不當,而在 WaitGroup 栽了跟頭?**
在 Go 中,sync 包下的 WaitGroup 能有助於我們控制協程之間的同步。當需要等待一組協程都執行完各自任務後,才能繼續後續邏輯。這種場景,就非常適合使用它。但是,在使用 WaitGroup 的過程中,你可能會犯錯誤,下文我們將通過示例逐步探討。任務示例----初始任務假設我們有以下任務 woker,它執行的任務是將參數 msg 打印出來。func worker(msg string) ⌘ [Read more](https://www.readfog.com/a/1696502614274969600) 2023-03-20T03:19:23Z **Go 語言實現創建型設計模式 - 單例模式**
01 介紹單例模式(Singleton Pattern)是一種創建型設計模式,它確保一個類只有一個實例,並提供一個全局訪問點。因爲它同時解決了兩個問題,所以它違反了單一職責原則。02 使用場景什麼場景適合使用單例模式呢?某個類對於所有客戶端只有一個可用的實例比如記錄應用程序的運行日誌,因爲記錄日誌的文件只有一個,所以只能有一個日誌類的實例向日志文件中寫入,否則會出現日誌內容互相覆蓋的問題。需要更加 ⌘ [Read more](https://www.readfog.com/a/1696864600444735488) 2023-03-20T03:35:03Z **聊聊 godoc、go doc 與 pkgsite**
查看文檔是開發人員日常必不可少的開發活動之一。Go 語言從誕生那天起就十分重視項目文檔的建設,爲此 Go 爲 gopher 們提供了多種豐富的文檔查看工具,除了在 Go 官方網站 [5] 可以在線查看到最新穩定發佈版的文檔之外,Go 還爲開發人員提供了本地離線查看文檔的工具,比如:godoc[6]、go doc 以及 pkgsite[7]。在這篇短文中,我們就來分別看看這三個 Go 文檔查看工具。 ⌘ [Read more](https://www.readfog.com/a/1696865586428088320) 2023-03-23T06:14:55Z **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](https://www.readfog.com/a/1697147434979921920) 2023-03-24T03:19:54Z **Go 語言 new 和 make 關鍵字的區別**
本篇文章來介紹一道非常常見的面試題,到底有多常見呢?可能很多面試的開場白就是由此開始的。那就是 new 和 make 這兩個內置函數的區別。其實這個問題本身並不複雜,簡單來說就是,new 只分配內存,而 make 只能用於 slice、map 和 chan 的初始化,下面我們就來詳細介紹一下。new---new 是一個內置函數,它會分配一段內存,並返回指向該內存的指針。其函數簽名如下:源碼// T ⌘ [Read more](https://www.readfog.com/a/1697227020944117760) 2023-03-24T03:38:07Z **Go 語言自帶設計模式**
概述\-\- 在軟件工程中,設計模式(design pattern)是對軟件設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。 -- 維基百科和傳統的 GOF, Java, C# 教科書式的 設計模式 不同,Go 語言設計從一開始就力求簡潔,有其他編程語言基礎的讀者在學習和使用 Go 語言時, 萬萬不可按圖索驥、生搬硬套,簡單的事情複雜化。本文帶領大家一起看一下,Go 語言標準庫中自帶的 編程 ⌘ [Read more](https://www.readfog.com/a/1697228166610915328) 2023-03-24T03:35:42Z **深入解析 nbio 框架**
圖片拍攝於 2023 年 3 月 18 日 杭州大屋頂所到之處處處皆 Ai,所見之人人人皆唸咒。之前更新的一系列,好久沒更新了,差點爛尾,我不允許這樣的事情在我身上發生 (雖然已經爛尾好幾次了😭)。evio 原理解析~有彩蛋 Go 網絡庫 Gnet 解析 Go netpoll 大解析在上一篇文章中,我們探討了基於 epoll 的 Go Netpoll 框架的早期實現——evio。我們還指出了它 ⌘ [Read more](https://www.readfog.com/a/1697228014670155776) 2023-03-24T03:50:37Z **Go 語言併發模式代碼模板**
前言文章代碼量較多,如果是初次閱讀,建議瞭解每種模式的基礎用法即可,工作中有實際的應用開發場景時,再回來研究代碼細節。經典模式 (pipeline + selector)這裏有一個來自 Go 官方博客的例子,通過管道篩選質數並打印。質數篩選器第一個版本-----package mainimport "fmt"// 生成數字併發送到通道func generate(ch chan int) { ⌘ [Read more](https://www.readfog.com/a/1697228953791598592) 2023-03-24T03:53:17Z **「Go 工具箱」Pie :一個高性能、類型安全的 slice 操作庫**
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。在 Go 語言中,對 slice 和 map 是我們最常用的數據結構。比如,計算兩個切片的交集、差集;判斷切片中的元素是否都滿足某個條件的等。我推薦大家使用這個包:elliotchance/pie。以下是該包的基本情況:cuklbQ使 ⌘ [Read more](https://www.readfog.com/a/1697229120891621376) 2023-03-24T04:02:30Z **go 中的平滑關閉究竟是怎麼關閉的**
關閉軟件可以分爲平滑關閉(軟關閉)和硬關閉。就像我們在關閉電腦的時候,有時候遇到電腦死機,會直接長按開關鍵,直至電腦關機,這就是硬關機。而通過電腦上的菜單選擇 “關機”,則屬於軟關機(平滑關閉)。在軟關機的時候,大家應該會注意到時間會比較長,時不時還會有彈窗彈出 詢問是否要退出。在我們自己編寫的 web 應用中,實際上也是需要有軟關閉的。今天我就 golang 中的 gin 框架爲例,來聊聊平滑關 ⌘ [Read more](https://www.readfog.com/a/1697229700920872960)