原创 defer 鏈如何被遍歷執行

去年開始寫文章的第一篇就是關於 defer,名字比較文藝:《Golang 之輕鬆化解 defer 的溫柔陷阱》,還被吐槽了。因爲這篇文章,到《Go 夜讀》講了一期。不過當時純粹是應用層面的,也還沒有跳進 Go 源碼這個大坑,文章看着比較

原创 忠於職守 —— sysmon 線程到底做了什麼?(九)

在 runtime.main() 函數中,執行 runtime_init() 前,會啓動一個 sysmon 的監控線程,執行後臺監控任務:systemstack(func() { // 創建監控線程,該線程獨立於調度器,不需要

原创 架構的腐化是必然的

架構的腐化是必然的,不以人的意志爲轉移。我們先從一個故事開始,從前有一個公司,這個公司有一個部門,這個部門裏有兩個組。兩個組做的項目比較類似,都是策略類項目。其中一個組做需求基本靠堆人,業務和 PM 的所有需求,能找到人,並且讓這個人在

原创 深度解密Go語言之pprof

相信很多人都聽過“雷神 3”關於性能優化的故事。在一個 3D 遊戲引擎的源碼裏,John Carmack 將 1/sqrt(x) 這個函數的執行效率優化到了極致。 一般我們使用二分法,或者牛頓迭代法計算一個浮點數的平方根。但在這個

原创 fasthttp 快在哪裏

坊間傳言 fasthttp 在某些場景下比 nginx 還要快,說明 fasthttp 中應該是做足了優化。我們來做一些相關的驗證工作。先是簡單的 hello server 壓測。下面的結果是在 mac 上得到的,linux 下可能會有

原创 深度解密Go語言之sync.map

工作中,經常會碰到併發讀寫 map 而造成 panic 的情況,爲什麼在併發讀寫的時候,會 panic 呢?因爲在併發讀寫的情況下,map 裏的數據會被寫亂,之後就是 Garbage in, garbage out,還不如直接 pani

原创 驚!空 struct 地址竟然不相等

Go 語言裏的空 struct{} 是一個特殊的結構,因爲編譯器優化的關係,會導致我們拿空 struct 指針做比較的時候出現一些意外的結果。之前有人提過相關的 issue,不過還是值得我們簡單研究一番。官方 spec 中對此的描述是:

原创 “���”引發的線上事故

由於 qcrao.com 域名正在備案中,暫時通過 https://qcrao.github.io/ 訪問博客。周知。最近遇到了一起依賴升級 + 異常數據引發的線上事故,教訓慘痛,本文對此進行回故和總結。背景起因是我們使用的服務框架版本

原创 Go Modules 的智障版本選擇

之前 go mod 用的比較少,而且一直聽社區有各種抱怨,所以也興趣寥寥。新公司的項目直接使用了 go mod,本來覺得無非是個簡單的工具,不需要學習,結果在一個簡單的依賴上卻浪費了很多時間。先來看看我碰到的例子:package mai

原创 Go 協作與搶佔

本文作者歐長坤,德國慕尼黑大學在讀博士,Go/etcd/Tensorflow contributor,開源書籍《Go 語言原本》作者,《Go 夜讀》SIG 成員/講師,對 Go 有很深的研究。Github:@changkun,https

原创 深度解密Go語言之sync.pool

最近在工作中碰到了 GC 的問題:項目中大量重複地創建許多對象,造成 GC 的工作量巨大,CPU 頻繁掉底。準備使用 sync.Pool 來緩存對象,減輕 GC 的消耗。爲了用起來更順暢,我特地研究了一番,形成此文。本文從使用到源碼解析

原创 聊聊 g0

很多時候,當我們跟着源碼去理解某種事物時,基本上可以認爲是以時間順序展開,這是編年體的邏輯。還有另一種邏輯,紀傳體,它以人物爲中心編排史事,使得讀者更聚焦於某個人物。以一種新的視角,把所有的事情串連起來,令人大呼過癮。今天我們試着以這樣

原创 defer 的前世今生

延遲語句 defer 在最早期的 Go 語言設計中並不存在,後來才單獨增加了這一特性,由 Robert Griesemer 完成語言規範的編寫 [Griesemer, 2009], 並由 Ken Thompson 完成最早期的實現 [T

原创 走過 2019

每年都需要做年度計劃、年終總結,白紙黑字,寫下自己對新一年的期待,對過去一年的回顧,這是一種儀式感。於我,更多的是讓焦慮暫停片刻,細細回顧過去一整年的得失,哪些地方來年可以做得更好。關於年度計劃,更多的其實是想象一個未來更美好的自己。光

原创 Golang error 的突圍

姍姍來遲的 Go 1.13 修改了 errors 包,增加了幾個函數,用於增強 error 的功能,這篇文章介紹 error 相關的用法。由於上上週發表的調度器系列文章的標題比較文藝,導致這篇文章的標題採用了相似的命名方法。我嘗試想寫一