自動生成代替interface的執行緒安全map

ggaaooppeenngg發表於2016-11-09

https://github.com/ggaaooppeenngg/safemap

專案當中經常要使用執行緒安全的map,但是實際編碼的時候會因為失誤引入一些非執行緒安全的程式碼。 把這些東西封裝成一個包是一個比較好的方式。

這個工具的主要的特點是能夠根據型別自動生成執行緒安全的map,做了一些簡單的測試如果用interface型別轉換的代價和用自動生成的固定型別的代價可能差距大概是20ns/op(40ns/op-20ns/op)的一個差距,當然這個差距並不是很致命的一個問題,至少用程式碼生成可以對效能有一個提升,可能引起的問題是專案中類似的map過多,生成的map的程式碼可能會很多,所以綜合考量的話,在一個包裡只有一兩個map是要保證執行緒的安全的話,其實是很適合的,也比較方便管理,不管是在build的時候生成還是把生成的程式碼放入版本控制當中。當然也有很多自動生成的庫可以用,但是為了減少依賴並沒有使用。

使用方式可以結合go generate使用,比如在程式碼中嵌入。

//go:generate safemap -k string -v string -n namespace

在專案中會生成namespace_safemap.go檔案,型別為type namespaceSafemap map[string]string,對應的GetSet方法是執行緒安全的。

目前正在做的是一個類似的實現思路的cache,https://github.com/ggaaooppeenngg/cachemap

相關文章