猿问

Golang 与 GORM。如何正确地将模型类型传递给方法?

我有下一个 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

}

正如您在这里看到的,方法中有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?


偶然的你
浏览 98回答 2
2回答

墨色风雨

Gorm 不想将数据解组为您的空接口类型。即使您传递的是实现该特定接口的结构,它在传递后仍保持类型化为接口。您需要将该item接口转换回您的User结构。喜欢item.(entity.User)

素胚勾勒不出你

哦,我已经修好了。现在Find从服务调用存储库方法&item:func (c CrudService) GetItem(id uint) entity.InterfaceEntity {&nbsp; &nbsp; var item entity.User&nbsp; &nbsp; return c.repository.Find(id, &item)}存储库方法item不通过&:func (c CrudRepository) Find(id uint, item entity.InterfaceEntity) entity.InterfaceEntity {&nbsp; &nbsp; c.db.First(item, id)&nbsp; &nbsp; return item}
随时随地看视频慕课网APP

相关分类

Go
我要回答