成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go Struct 初始化風格的抉擇

開發 前端
最近在對之前的代碼做重構,從之前的 MVC 結構切換到 Clean Arch 的結構,但是在切換的時候關于代碼風格出現了一些困惑。

最近在對之前的代碼做重構,從之前的 MVC 結構切換到 Clean Arch 的結構,但是在切換的時候關于代碼風格出現了一些困惑。

在下面的代碼中 repository 是存儲庫,主要用于封裝數據庫查詢或者是第三方微服務的調用,它實現了 domain.IAzRepository 接口,其他層的代碼都只依賴這個接口而不依賴具體的實現

[[353658]]

三種代碼風格

風格一

在 Go 中我們常常“返回實現(struct),依賴接口”,其實就是在函數返回的時候我們返回一個具體的實現,函數的參數或者是 Struct 的成員部分我們依賴接口,這個風格看起來是違背了這個原則的

 

  1. // repository 存儲庫 
  2. type repository struct { 
  3.     db *gorm.DB 
  4.  
  5. // NewAZRepository NewAZRepository 
  6. func NewAZRepository(db *gorm.DB) domain.IAzRepository { 
  7.     return &repository{db: db} 

風格二

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

 

  1. // repository 存儲庫 
  2. type repository struct { 
  3.     db *gorm.DB 
  4.  
  5. // NewAZRepository NewAZRepository 
  6. func NewAZRepository(db *gorm.DB) *repository { 
  7.     return &repository{db: db} 

風格三

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

 

  1. // Repository 存儲庫 
  2. type Repository struct { 
  3.     db *gorm.DB 
  4.  
  5. // NewAZRepository NewAZRepository 
  6. func NewAZRepository(db *gorm.DB) *Repository { 
  7.     return &Repository{db: db} 

選擇

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

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

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

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

責任編輯:未麗燕 來源: Mohuishou
相關推薦

2021-09-27 07:39:52

Go初始化函數package

2023-11-12 23:08:17

C++初始化

2012-03-13 13:38:42

Java

2009-06-10 16:17:00

Netbeans JT初始化

2021-07-07 05:00:17

初始化源碼

2011-03-16 10:52:20

2022-07-27 08:56:29

Go程序多版本

2011-06-17 15:29:44

C#對象初始化器集合初始化器

2010-07-28 10:22:33

FlexApplica

2021-03-12 10:30:11

SpringMVC流程初始化

2022-07-06 10:37:45

SpringServlet初始化

2020-12-03 09:50:52

容器IoC流程

2019-11-04 13:50:36

Java數組編程語言

2009-09-08 09:48:34

LINQ初始化數組

2009-11-11 15:29:15

ADO初始化

2023-10-06 20:57:52

C++聚合成員

2012-05-23 12:46:53

JavaJava類

2010-09-08 14:49:09

藍牙協議棧

2024-01-15 06:34:09

Gin鏡像容器

2009-07-31 17:51:27

C#對象初始化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美a在线观看 | 久久噜噜噜精品国产亚洲综合 | 久久www免费人成看片高清 | 国产在线拍偷自揄拍视频 | 97视频久久 | 日韩aⅴ视频 | 九九热国产精品视频 | 一区二区三区精品 | 特a毛片 | 99资源| 国产精品免费观看视频 | 97精品视频在线 | 亚洲社区在线 | 国产精品成人在线观看 | 午夜三级在线观看 | 欧美日一区二区 | 日韩欧美一区二区三区免费观看 | 毛片1 | 嫩呦国产一区二区三区av | 午夜影院黄 | 日韩欧美黄色 | 国产农村一级国产农村 | 一区二区免费 | 国产精品久久久久久一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 国产精品69毛片高清亚洲 | 精品国产91乱码一区二区三区 | 日韩中文在线观看 | 国产一区二区三区四区在线观看 | 99re66在线观看精品热 | 能看的av | 国产成人一区 | 91社区在线观看高清 | 成人免费一区二区 | 国产成人精品一区二区三区在线观看 | 综合欧美亚洲 | 久久久噜噜噜久久中文字幕色伊伊 | 人人澡人人射 | 精品欧美 | 91精品国产91久久久 | 久久视频精品 |