網頁

2022/6/8

Golang 別用init()和package變數?

Go的init()和package變數盡可能少用,因為會降低可讀性並使除錯困難。


Go語言大師之一Peter Bourgon在他的2017/6/9的文章「A theory of modern Go」寫到:magic is bad; global state is magic → no package level vars; no func init,並闡述了使用init()和package var的問題。大概是說這兩個東西會造成副作用(side effect)使程式狀態變得不明導致結果難以預期,應該明確地以參數注入函式要使用的依賴。

也因此有人寫了go linter工具gochecknoglobalsgochecknoinits來檢查。

但程式要有狀態則side effect無法避免,例如總是有需要用到singleton或全域變數的場合,所以應該是要審慎地使用,所以標題才打個問號。


事情總是一體兩面,例如Java的反射、annotation、AOP就完全相反有超多的side effect,而目的是為了讓程式更專注在業務邏輯本身,但缺點就是那些"magic"出了問題就難除錯(所以有Java haters)。但不用這些magic業務邏輯中就會出現許多和業務無關的程式如日誌、交易、快取、權限、狀態及物件生命週期管理等,有好有壞。

沒有留言:

張貼留言