這是一篇聽完 podcast 的心得分享,因為上集有點長,所以拆成兩個部分,這是下集
3. Generic
這是個常見的主題,贊成或是反對兩邊的人大概是一半一半,Podcast 中的討論其實也沒有說一定對這件事給出一個答案,我想這件事就大家自己判斷吧~
這樣寫感覺有點偷懶,所以列一下什麼是 generic
Generic programming means writing functions and data structures where some types are left to be specified later
Advantage:
- 方便
- 減少重複的程式碼
DisAdvantage:
- 效能降低
- 難以閱讀
4. “time.After” causes memory leak
這是一個很容易犯的小錯誤,相信大家都看過類似的 code
for {
select{
case <- ch:
// do something
case <- time.After(5*time.Minute):
// timout handle
}
}
正常使用下,time.After 是會被 GC 回收的
The underlying Timer is not recovered by the garbage collector until the timer fires.
但是要等設定的時間到了(fires)之後才會被 GC 回收,所以這樣會有什麼問題呢?
如果你的 ← ch 是一個非常頻繁被使用的 channel ,比如說一秒有 60k 訊息通過這個 channel ,則會在第一個 timer 被GC 回收之前,產生 18M timer 出來(60K * 5mins )把你的 memory 搞爆
所以如果你的程式符合這個情境,請快點去修改吧!
改法如下:
duration := 5 * time.Minute
timer := time.NewTimer(duration)
defer timer.Stop()
for {
timer.Reset(duration)
select {
case <- timer.C:
//
}
}
5. make everything public
如果有人只是不知道大寫是 public ,小寫是 private ,那就沒事了,因為比較大的問題是你把所有的 property, func variable 都寫成了 public。盡量不公開,或是只公開你不得已、非得要公開的東西,才是比較好的做法,因為那會讓其他人對你的 package 的依賴、耦合性降到最低。
最後,這個主題是因為有一位講者寫了一片文章,The Top 10 Most Common Mistakes I’ve Seen in Go Projects 因為這一篇文章的反應不錯,所以寫了一本書 100 Go Mistakes: How to Avoid Them ,有興趣的人可以去試閱看看。