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() 方法中的 itemlocal 变量。

我使用来自服务的下一个方式通过 item

func (c CrudService) GetItem(id uint) entity.InterfaceEntity {
    var item entity.User
    return c.repository.Find(id, item)
}

看来 localitem 必须相等,行为必须等价。

但输出是

--- 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
}