原创 golang gc的內部優化

今天講一個常見的gc compiler(也就是官方版本的go編譯器和runtime)在垃圾回收的掃描標記階段做的優化。 我對這個優化的描述印象最深的是在bigcache的註釋裏,大致內容是如果map的鍵值都不包含指針,那麼gc掃描的時候不管

原创 errgroup的常見誤用

errgroup想必稍有經驗的golang程序員都應該聽說過,實際項目中用過的也應該不在少數。它和sync.WaitGroup類似,都可以發起執行並等待一組協程直到所有協程運行結束。除此之外errgroup還可以在協程出錯時取消當前的con

原创 golang chan傳遞數據的性能開銷

這篇文章並不討論chan因爲加鎖解鎖以及爲了維持內存模型定義的行爲而付出的運行時開銷。 這篇文章要探討的是chan在接收和發送數據時因爲“複製”而產生的開銷。 在做性能測試前先複習點基礎知識。 本文索引 數據是如何在chan裏流動的

原创 我們能從PEP 703中學到什麼

PEP703是未來去除GIL的計劃,當然現在提案還在繼續修改,但大致方向確定了。 對於實現細節我沒啥興趣多說,挑幾個我比較在意的點講講。 儘量少依賴原子操作的引用計數 沒了GIL之後會出現兩個以上的線程同時操作同一個Python對象的情況,

原创 golang1.21新特性速覽

經過了半年左右的開發,golang 1.21 在今天早上正式發佈了。 這個版本中有不少重要的新特性和變更,尤其是在泛型相關的代碼上。 因爲有不少大變動,所以建議等第一個patch版本也就是1.21.1出來之後再進行升級,以免遇到一些意外的b

原创 簡單瞭解下最近正火的SwissTable

去年看到字節跳動給golang提了issue建議把map的底層實現改成SwissTable的時候,我就有想寫這篇博客了,不過因爲種種原因一直拖着。 直到最近遇golang官方開始討論爲了是否要接受SwissTable作爲map的默認實現,以

原创 讓golang程序生成coredump文件並進行調試

今天講講怎麼讓golang程序生成coredump文件,並且進行調試的。 別看我寫了不少golang的博客,其實我平時寫c++的時間更多,所以也算和coredump是老相識了。core dump文件實際上是進程在某個時間點時的內存映像,當時

原创 golang中一種不常見的switch語句寫法

最近翻開源代碼的時候看到了一種很有意思的switch用法,分享一下。 注意這裏討論的不是typed switch,也就是case語句後面是類型的那種。 直接看代碼: func (s *systemd) Status() (Status, e

原创 小心golang中的無類型常量

對於無類型常量,可能大家是第一次聽說,但這篇我就不放進拾遺系列裏了。 因爲雖然名字很陌生,但我們每天都在用,每天都有無數潛在的坑被埋下。包括我本人也犯過同樣的錯誤,當時代碼已經合併併發布了,當我意識到出了什麼問題的時候爲時已晚,最後不得不多

原创 golang拾遺:實現一個不可複製類型

這是golang拾遺系列的第六篇。這個系列主要用來記錄一些平時不常見的知識點,偶爾也會實現些有意思的小功能,比如這篇。 golang拾遺系列目錄: golang拾遺:指針和接口 golang拾遺:爲什麼我們需要泛型 golang拾遺:嵌入

原创 爲什麼標準庫的模板變量都是inline的

最近在看標準庫裏的type_traits的時候發現了個有趣的地方,幾乎所有在標準庫裏的變量模板都是inline的! 不僅常見的實現上(libstdc++、libc++、ms stl)都是inline的,標準裏給的形式定義也是inline的。

原创 爲什麼你的static_assert不能按預期的工作?

static_assert是c++11添加的新語法,它可以使我們在編譯期間檢測一些斷言條件是否爲真,如果不滿足條件將會產生一條編譯錯誤信息。 使用靜態斷言可以提前暴露許多問題到編譯階段,極大的方便了我們對代碼的排錯,提前將一些bug扼殺在搖

原创 golang拾遺:自定義類型和方法集

golang拾遺主要是用來記錄一些遺忘了的、平時從沒注意過的golang相關知識。 很久沒更新了,我們先以一個謎題開頭練練手: package main import ( "encoding/json" "fmt"

原创 修復Arch Linux和Manjaro Linux無法顯示emoji的問題

安裝好Arch Linux或Manjaro Linux系統後默認沒辦法正常顯示emoji,通常會變成方框或者帶有unicode碼的方塊: 這是因爲缺失字體以及相關的字體配置導致的。 當然也有一小部分應用沒有這個問題(比如Chrome),因

原创 golang拾遺:內置函數len的小知識

len是很常用的內置函數,可以測量字符串、slice、array、channel以及map的長度/元素個數。 不過你真的瞭解len嗎?也許還有一些你不知道的小知識。 我們來看一道GO101的題目,這題也被GO語言愛好者週刊轉載: packa