亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Gorm:是否可以為常見的數據庫操作定義共享方法(例如,通過id獲?。??

Gorm:是否可以為常見的數據庫操作定義共享方法(例如,通過id獲取)?

Go
一只斗牛犬 2022-08-24 15:40:10
在項目中使用 和。gogorm我創建了一個級別來包裝數據庫操作,每個表都有自己的 dao 類型。dao當前代碼Get方法從表和:FirstDaofirstFirstModelfunc (dao *FirstDao) Get(id uint64) (*model.FirstModel, error) {}Get方法從表和:SecondDaosecondSecondModelfunc (dao *SecondDao) Get(id uint64) (*model.SecondModel, error) {}我想要實現的目標想知道是否可以用一種方法編寫一個 in go,這樣我就不必寫這個代碼 2 次了。BaseDaoGet()這在Java中非常容易,但是由于go非常不同,并且不支持真正的繼承(我猜),所以不確定這是否可能。我嘗試過什么定義一個模型接口,并嘗試使用 refection。但失敗了。主要原因:在方法內部,它仍然需要原始特定結構的實例,例如,我將其作為接口傳遞,并且不能將其用作原始類型。Get()model.FirstModel{}model.Model結構嵌入。谷歌搜索問題可以做到這一點嗎?如果不是,為什么?如果是,如何?
查看完整描述

3 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

如果您嘗試完全繞過為每個 DAO 編寫方法,則唯一的解決方案是從此方法返回 a。然而,這種方法會產生兩個問題:Get()interface{}

  • 您需要手動將所有內容都強制轉換。interface{}

  • 你正在破壞安全型。

我認為最好的解決方案是通過使用結構嵌入來共享大部分代碼,并為每個DAO編寫輕量級包裝器,以將不安全的值轉換為類型安全值。interface{}

首先使用泛型方法創建基本 DAO。Go 中沒有類型泛型,因此應在此處返回 。Get()interface{}


type BaseDAO struct {}


func (*BaseDAO) Get(id uint64) (interface{}, error) {}

然后,對于每種類型的數據,創建一個特定的DAO實現,嵌入:BaseDAO


type FooModel = string


type FooDAO struct {

    // Embbeding BaseDAO by not specifying a name on this field

    // BaseDAO methods can be called from FooDAO instances

    BaseDAO

}


func (foo *FooDAO) Get(id uint64) (FooModel, error) {

    // Call the shared Get() method from BaseDAO.

    // You can see this just like a `super.Get()` call in Java.

    result, _ := foo.BaseDAO.Get(id)

    return result.(FooModel), nil

}


查看完整回答
反對 回復 2022-08-24
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

type BaseDao struct {

    FirstDao

    SecondDao

}


func (dao *BaseDao) Get(id uint64) (*model.SecondModel, error) {

}

只是寫下我的想法。也許這將有助于您解決您的解決方案


查看完整回答
反對 回復 2022-08-24
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

也許不能。因為圍棋劑量不支持1.18之前的genrics。


我認為提取層可能是一個反模式,如果你想使用鉤子。dao


想象一下:


// pkg models

type User

type UserChangeLog


func (user *User) afterUpdate(tx) error () {

  // if you want to record user changes

  userChangeLogDao().insert(user)

}

// pkg dao

func (userDao) update() {}

func (userChangeLogDao) insert(User){}

它導致道和模型之間import cycle


查看完整回答
反對 回復 2022-08-24
  • 3 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號