我有下一個 GORM 模型package entityimport ( "github.com/jinzhu/gorm")type InterfaceEntity interface {}type User struct { InterfaceEntity gorm.Model Name string}我嘗試將 GORM 實體類型傳遞到基礎 crud 存儲庫中。我的基礎 crud 存儲庫:package repositoryimport ( "billingo/model/entity" "fmt" "github.com/jinzhu/gorm" "reflect")type CrudRepository struct { *BaseRepository}func NewCrudRepository(db *gorm.DB) CrudRepositoryInterface { repo := NewBaseRepository(db).(*BaseRepository) return &CrudRepository{repo}}func (c CrudRepository) Find(id uint, item entity.InterfaceEntity) entity.InterfaceEntity { fmt.Println("--- Initial") var local entity.User fmt.Println("--- local: ", reflect.TypeOf(local), local) fmt.Println("--- Item: ", reflect.TypeOf(item), item) fmt.Println("--- Values") c.db.First(&local, id) fmt.Println("--- local: ", reflect.TypeOf(local), local) c.db.First(&item, id) fmt.Println("--- Item: ", reflect.TypeOf(item), item) return item}正如您在這里看到的,方法中有item和local變量Find()。我item通過服務的下一種方式傳遞:func (c CrudService) GetItem(id uint) entity.InterfaceEntity { var item entity.User return c.repository.Find(id, item)}看來whatlocal和item必須是equals和behavior必須是等價的。但是輸出是--- Initial--- local: entity.User {<nil> {0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} }--- Item: entity.User {<nil> {0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} }--- Values--- local: entity.User {<nil> {1 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} test 1}--- Item: entity.User {<nil> {0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} }INFO[0000] User info user="{<nil> {0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} }" user-id=1(/home/mnv/go/src/billingo/model/repository/CrudRepository.go:29) [2019-05-17 17:07:37] unsupported destination, should be slice or struct item從服務傳遞到消息不支持的目標,應該是 slice 或 struct如何item正確通過,我需要像 with 這樣的行為local?
2 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
Gorm 不想將數據解組為您的空接口類型。
即使您傳遞的是實現該特定接口的結構,它在傳遞后仍保持類型化為接口。您需要將該item
接口轉換回您的User
結構。
喜歡item.(entity.User)

素胚勾勒不出你
TA貢獻1827條經驗 獲得超9個贊
哦,我已經修好了。
現在Find從服務調用存儲庫方法&item:
func (c CrudService) GetItem(id uint) entity.InterfaceEntity {
var item entity.User
return c.repository.Find(id, &item)
}
存儲庫方法item不通過&:
func (c CrudRepository) Find(id uint, item entity.InterfaceEntity) entity.InterfaceEntity {
c.db.First(item, id)
return item
}
- 2 回答
- 0 關注
- 133 瀏覽
添加回答
舉報
0/150
提交
取消