• 當前位置:聯(lián)升科技 > 技術(shù)資訊 > 開(kāi)發(fā)技術(shù) >

    Go Struct 初始化風(fēng)格的抉擇

    2020-11-23    作者:Mohuishou    來(lái)源:Mohuishou    閱讀: 次
    最近在對之前的代碼做重構,從之前的 MVC 結構切換到 Clean Arch 的結構,但是在切換的時(shí)候關(guān)于代碼風(fēng)格出現了一些困惑。
    在下面的代碼中 repository 是存儲庫,主要用于封裝數據庫查詢(xún)或者是第三方微服務(wù)的調用,它實(shí)現了 domain.IAzRepository 接口,其他層的代碼都只依賴(lài)這個(gè)接口而不依賴(lài)具體的實(shí)現

    三種代碼風(fēng)格
    風(fēng)格一
    在 Go 中我們常常“返回實(shí)現(struct),依賴(lài)接口”,其實(shí)就是在函數返回的時(shí)候我們返回一個(gè)具體的實(shí)現,函數的參數或者是 Struct 的成員部分我們依賴(lài)接口,這個(gè)風(fēng)格看起來(lái)是違背了這個(gè)原則的
    // repository 存儲庫 
    type repository struct { 
        db *gorm.DB 
    // NewAZRepository NewAZRepository 
    func NewAZRepository(db *gorm.DB) domain.IAzRepository { 
        return &repository{db: db} 
    風(fēng)格二
    這個(gè)風(fēng)格返回了實(shí)現,并且由于并沒(méi)有導出看起來(lái)也具有封裝的特性,但是如果你運行 golint 你就會(huì )發(fā)現會(huì )拋出錯誤,因為這么寫(xiě),會(huì )導致我們用導出的方法將沒(méi)有導出 struct 給暴露了出去
    // repository 存儲庫 
    type repository struct { 
        db *gorm.DB 
    // NewAZRepository NewAZRepository 
    func NewAZRepository(db *gorm.DB) *repository { 
        return &repository{db: db} 
    風(fēng)格三
    這個(gè)寫(xiě)法的主要問(wèn)題是,由于 Repository 被導出,所以在外部其他的包中就可以直接通過(guò) &Repository{} 進(jìn)行初始化,這樣初始化之后使用就會(huì )導致 panic,因為成員函數是一個(gè) nil 指針
    // Repository 存儲庫 
    type Repository struct { 
        db *gorm.DB 
    // NewAZRepository NewAZRepository 
    func NewAZRepository(db *gorm.DB) *Repository { 
        return &Repository{db: db} 
    選擇
    選擇總是困難的,帶著(zhù)這個(gè)問(wèn)題我咨詢(xún)了同組的同事還有好幾個(gè) Go 語(yǔ)言交流群的同學(xué),其中大部分都會(huì )選擇風(fēng)格三,小部分會(huì )選擇風(fēng)格一,風(fēng)格二幾乎沒(méi)有人選擇。最后我選什么呢?
    最后我的選擇是風(fēng)格一,這是針對場(chǎng)景來(lái)的,因為我們的這個(gè)包其實(shí)不希望其他包直接依賴(lài)實(shí)現,因為后續有可能隨著(zhù)發(fā)展被單獨拆分成一個(gè)微服務(wù)或者是需要更換存儲庫,如果外部有包直接依賴(lài) repository 會(huì )導致后續的重構比較困難
    除此之外,我們在其他地方一般還是會(huì )選擇風(fēng)格三,因為結構體名不導出,外部其實(shí)沒(méi)有比較好的辦法進(jìn)行初始化,例如想要 var r Repository ,至于前面提到的直接字面量初始化的問(wèn)題,我們可以通過(guò)統一代碼風(fēng)格解決。
    在 外部包 中除了用于參數傳遞的 Option 結構之外,其余的不允許直接通過(guò) &XXX{} 的方式進(jìn)行初始化


    相關(guān)文章

    我們很樂(lè )意傾聽(tīng)您的聲音!
    即刻與我們取得聯(lián)絡(luò )
    成為日后肩并肩合作的伙伴。

    行業(yè)資訊

    聯(lián)系我們

    13387904606

    地址:新余市仙女湖區仙女湖大道萬(wàn)商紅A2棟

    手機:13755589003
    QQ:122322500
    微信號:13755589003

    江西新余網(wǎng)站設計_小程序制作_OA系統開(kāi)發(fā)_企業(yè)ERP管理系統_app開(kāi)發(fā)-新余聯(lián)升網(wǎng)絡(luò )科技有限公司 贛ICP備19013599號-1   贛公網(wǎng)安備 36050202000267號   

    微信二維碼
    色噜噜狠狠一区二区三区果冻|欧美亚洲日本国产一区|国产精品无码在线观看|午夜视频在线观看一区|日韩少妇一区二区无码|伊人亚洲日韩欧美一区二区|国产在线码观看清码视频