溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go Struct初始化風格的抉擇方法是什么

發(fā)布時間:2021-10-23 16:40:04 來源:億速云 閱讀:177 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“Go Struct初始化風格的抉擇方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Go Struct初始化風格的抉擇方法是什么”吧!

三種代碼風格

風格一

在 Go 中我們常?!胺祷貙崿F(xiàn)(struct),依賴接口”,其實就是在函數(shù)返回的時候我們返回一個具體的實現(xiàn),函數(shù)的參數(shù)或者是 Struct  的成員部分我們依賴接口,這個風格看起來是違背了這個原則的

// repository 存儲庫 type repository struct {     db *gorm.DB }  // NewAZRepository NewAZRepository func NewAZRepository(db *gorm.DB) domain.IAzRepository {     return &repository{db: db} }

風格二

這個風格返回了實現(xiàn),并且由于并沒有導出看起來也具有封裝的特性,但是如果你運行 golint  你就會發(fā)現(xiàn)會拋出錯誤,因為這么寫,會導致我們用導出的方法將沒有導出 struct 給暴露了出去

// repository 存儲庫 type repository struct {     db *gorm.DB }  // NewAZRepository NewAZRepository func NewAZRepository(db *gorm.DB) *repository {     return &repository{db: db} }

風格三

這個寫法的主要問題是,由于 Repository 被導出,所以在外部其他的包中就可以直接通過 &Repository{}  進行初始化,這樣初始化之后使用就會導致 panic,因為成員函數(shù)是一個 nil 指針

// Repository 存儲庫 type Repository struct {     db *gorm.DB }  // NewAZRepository NewAZRepository func NewAZRepository(db *gorm.DB) *Repository {     return &Repository{db: db} }

選擇

選擇總是困難的,帶著這個問題我咨詢了同組的同事還有好幾個 Go  語言交流群的同學,其中大部分都會選擇風格三,小部分會選擇風格一,風格二幾乎沒有人選擇。最后我選什么呢?

最后我的選擇是風格一,這是針對場景來的,因為我們的這個包其實不希望其他包直接依賴實現(xiàn),因為后續(xù)有可能隨著發(fā)展被單獨拆分成一個微服務或者是需要更換存儲庫,如果外部有包直接依賴  repository 會導致后續(xù)的重構(gòu)比較困難

除此之外,我們在其他地方一般還是會選擇風格三,因為結(jié)構(gòu)體名不導出,外部其實沒有比較好的辦法進行初始化,例如想要 var r Repository  ,至于前面提到的直接字面量初始化的問題,我們可以通過統(tǒng)一代碼風格解決。

在 外部包 中除了用于參數(shù)傳遞的 Option 結(jié)構(gòu)之外,其余的不允許直接通過 &XXX{} 的方式進行初始化

到此,相信大家對“Go Struct初始化風格的抉擇方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI