2019年10月3日 星期四

golang context 讓程式變髒了


為了解決goroutine間(特別是多層樹狀)取消( cancelation )
在 go 1.7 提供了 context standard library。
https://blog.golang.org/context

雖然提供了方便簡潔的操控goroutine的取消方法,並利用channel自動的通知取消給所有子執行緒。以及讓整顆樹的goroutine都能共享資料。

但官方希望我們不要二次封裝 context,而採用參數方式傳到每一個相關的function裡,連變數名稱都幫我們想好( ctx ),而且還建議放第一個參數。
這.... ,說真的,我不太能接受。

我們原本優雅的程式,讓這 ctx 污了整個code。

func doSomething(...interface{}) {
...
}
硬生生要變成這樣...
func doSomething(ctx context.Context, ...interface{}) {
...
   ctx.Done()
}

context 讓程式變髒了,就為了執行 ctx.Done(),ctx.Value(key)

@@

其實在讀完context的原始碼後,大概能理解原由。
雖然context source code寫得相當精要傳神,但個人認為其還是有許多的改善空間。