原创 Go map原理剖析

在使用map的過程中,有兩個問題是經常會遇到的:讀寫衝突和遍歷無序性。爲什麼會這樣呢,底層是怎麼實現的呢?帶着這兩個問題,我簡單的瞭解了一下map的增刪改查及遍歷的實現。 結構 hmap type hmap struct { //

原创 深入理解Go-sync.Map原理剖析

Map is like a Go map[interface{}]interface{} but is safe for concurrent useby multiple goroutines without additional loc

原创 深入理解Go-runtime.SetFinalizer原理剖析

finalizer是與對象關聯的一個函數,通過runtime.SetFinalizer 來設置,它在對象被GC的時候,這個finalizer會被調用,以完成對象生命中最後一程。由於finalizer的存在,導致了對象在三色標記中,不可能被標

原创 深入理解Go-defer的原理剖析

defer 也是Go裏面比較特別的一個關鍵字了,主要就是用來保證在程序執行過程中,defer後面的函數都會被執行到,一般用來關閉連接、清理資源等。 1. 結構概覽 1.1. defer type _defer struct { siz

原创 深入理解go-channel和select的原理

Go最吸引人的兩個地方,除了goroutine,也就是channel了,同時,我一直很納悶,select到底是怎麼實現的?跟我之前的文章一樣,部分無關的代碼直接省略 1. 結構概覽 1.1. hchan 這個就是channel的結構體了 t

原创 深入理解Go-goroutine的實現及調度器分析

在學習Go的過程中,最讓人驚歎的莫過於goroutine了。但是goroutine是什麼,我們用go關鍵字就可以創建一個goroutine,這麼多的goroutine之間,是如何調度的呢? 1. 結構概覽 在看Go源碼的過程中,遍地可見g、

原创 Go Http包解析:爲什麼需要response.Body.Close()

最近線上的一個項目遇到了內存泄露的問題,查了heap之後,發現 http包的 dialConn函數竟然佔了內存使用的大頭,這個有點懵逼了,後面在網上查詢資料的時候無意間發現一句話 10次內存泄露,有9次是goroutine泄露。 結果發現,

原创 MyISAM與InnoDB性能測試對比

MyISAM與InnoDB的優缺點在此就不再多說了,網上可以搜出一堆,而這種文章的最後一般都是推薦,讀的多的使用MyISAM,寫與更新多的推薦InnoDB,但是,瞭解過兩種存儲引擎之後,就會產生一種疑惑,InnoDB採用的是聚簇索引,無論是

原创 基於Nginx和dnsmasq實現路由的動態DNS解析

近期在跟前端同學聯調的時候,出現了一點小插曲,我們兩個的項目是同一個域名,然而,他的本地沒有搭服務端的運行環境,所以就導致了前端需要的hosts文件和請求接口需要的hosts文件不一致的情況,基於這種情況,我就考慮是否可以通過nginx來匹

原创 深入理解Go-內存分配

Go語言內置運行時(就是runtime),拋棄了傳統的內存分配方式,改爲自主管理,最開始是基於tcmalloc,雖然後面改動相對已經很大了。使用自主管理可以實現更好的內存使用模式,比如內存池、預分配等等,從而避免了系統調用所帶來的性能問題。

原创 深入理解Go-垃圾回收機制

Go的GC自打出生的時候就開始被人詬病,但是在引入v1.5的三色標記和v1.8的混合寫屏障後,正常的GC已經縮短到10us左右,已經變得非常優秀,了不起了,我們接下來探索一下Go的GC的原理吧 三色標記原理 我們首先看一張圖,大概就會對 三

原创 Go學習之Channel的一些模式

除了在goroutine之間安全的傳遞數據之外,在看了《Concurrency in Go》之後,感慨channel還有那麼多模式可供使用,在個人的學習中總結了以下幾種常用的模式 pipeline 概念 我們以爬蟲爲例,一般爬蟲分爲如下步驟

原创 Go學習之Channel總結

Channel是Go中的一個核心類型,你可以把它看成一個管道,通過它併發核心單元就可以發送或者接收數據進行通訊(communication)。 類型 T表示任意的一種類型 雙向: chan T 單向僅發送: chan <- 單向僅接受:

原创 深入理解Go-逃逸分析

How do I know whether a variable is allocated on the heap or the stack?From a correctness standpoint, you don't need to

原创 Go的調試工具:gdb vs dlv

GoLand編輯器雖然很強大,但是在展示內存及堆棧信息這一塊還是比較的弱,有可能是我的姿勢不對,所以,開始切入了gdb調試,但是gdb踩到了坑,並沒有解決,也就引發了gdb與dlv的對比了 gdb 安裝 yum install ncures