2021年3月22日 星期一

init function in Go package

撇開小程式不說,最近算是第一次把 Go 用在正式專案中,過程中不斷對架構修修改改,雖然我覺得這不啻是一件好事?表示有去思考怎樣寫對程式會更好,如果能在下筆前就先想清楚,寫起程式來應該會更行雲流水吧。

我算是以 C 語言出道的程式設計師,故很多時候我都只考慮到函數面向,坦白說光能夠適當的把函數拆分到不同的程式檔案中,這個程式已經有六成的可調整性,再來如果能夠把一些 Header 檔案的 include 相依性考慮清楚,我想九成的需求調整都不是什麼問題。

平常我在寫 Node.js 或是 Python 也是如此,Python 我不清楚,但 Node.js 是允許可以循環參照的,故只要不濫用全域變數(最多只用全域常數),大多時候應該是沒有什麼問題。

Go 本身不允許循環參照,我覺得這是一件好事,就像 Go 強制你要檢查 err != nil,藉由一些限制及規範,強迫使用者在寫程式前就先考慮清楚,其實也是方便你未來擴充程式。

以我的專案來說,我至少需要開發兩支獨立的執行檔,且這兩支用到的第三方模組都是一樣的,故當我在開發第一支執行檔時,我就打定主意使用多 package 的方式開發,這樣某些自己的 package 也可以給第二支執行檔使用。

雖然看了四、五本以上的 Go 書籍,但都已經是三年前的事,故我的程式架構在開發時覺得是順理成章的事,後來卻變成一個又一個的疑問,尤其現在開始開發第二支執行檔時特別明顯!

比如說,一個程式中有好多個 package,每個 package 都用了 package A,如果 package A 又有使用 init function,到底 init 會被執行幾次?雖然從結果來看只會執行一次,但我還是想要有個標準答案。

幸好 Go 本身就有提供 Spec 文件,不用像 C 一樣還要花錢買。於是很快的就在 Spec 中找到解答。

能夠每天在程式語言的道路上學習到新東西,那真的是一件快樂的事。

沒有留言:

張貼留言