Golang 与 GORM。如何正确地将模型类型传递给方法?
Golang with GORM. How to correctly pass model type into method?
我有下一个 GORM 模型
package entity
import (
"github.com/jinzhu/gorm"
)
type InterfaceEntity interface {
}
type User struct {
InterfaceEntity
gorm.Model
Name string
}
我尝试将 GORM 实体类型传递到基础 crud 存储库中。我的基础 crud 存储库:
package repository
import (
"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
}
正如您在此处看到的 Find()
方法中的 item
和 local
变量。
我使用来自服务的下一个方式通过 item
:
func (c CrudService) GetItem(id uint) entity.InterfaceEntity {
var item entity.User
return c.repository.Find(id, item)
}
看来 local
和 item
必须相等,行为必须等价。
但输出是
--- 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
从服务传递到消息
unsupported destination, should be slice or struct
如何正确传递 item
,我需要像 local
?
这样的行为
Gorm 不想将数据解组为您的空接口类型。
即使您传递的是实现该特定接口的结构,它在传递后仍保持为接口类型。您需要将该 item
接口转换回您的 User
结构。
喜欢item.(entity.User)
哦,我修好了
现在从服务调用存储库方法 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
}
我有下一个 GORM 模型
package entity
import (
"github.com/jinzhu/gorm"
)
type InterfaceEntity interface {
}
type User struct {
InterfaceEntity
gorm.Model
Name string
}
我尝试将 GORM 实体类型传递到基础 crud 存储库中。我的基础 crud 存储库:
package repository
import (
"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
}
正如您在此处看到的 Find()
方法中的 item
和 local
变量。
我使用来自服务的下一个方式通过 item
:
func (c CrudService) GetItem(id uint) entity.InterfaceEntity {
var item entity.User
return c.repository.Find(id, item)
}
看来 local
和 item
必须相等,行为必须等价。
但输出是
--- 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
从服务传递到消息
unsupported destination, should be slice or struct
如何正确传递 item
,我需要像 local
?
Gorm 不想将数据解组为您的空接口类型。
即使您传递的是实现该特定接口的结构,它在传递后仍保持为接口类型。您需要将该 item
接口转换回您的 User
结构。
喜欢item.(entity.User)
哦,我修好了
现在从服务调用存储库方法 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
}