Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 戈朗和戈姆。如何正确地将模型类型传递给方法?_Go_Go Gorm_Go Interface - Fatal编程技术网

Go 戈朗和戈姆。如何正确地将模型类型传递给方法?

Go 戈朗和戈姆。如何正确地将模型类型传递给方法?,go,go-gorm,go-interface,Go,Go Gorm,Go Interface,我有下一个GORM模型 包实体 进口( “github.com/jinju/gorm” ) 类型接口类型接口{ } 类型用户结构{ 界面性 戈姆模型 名称字符串 } 我尝试将GORM实体类型传递到基本crud存储库中。我的基本crud存储库: package repository import ( "billingo/model/entity" "fmt" "github.com/jinzhu/gorm" "reflect" ) type CrudRepos

我有下一个GORM模型

包实体
进口(
“github.com/jinju/gorm”
)
类型接口类型接口{
}
类型用户结构{
界面性
戈姆模型
名称字符串
}
我尝试将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
变量

我使用服务的下一条路通过
项目

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 
——首字母
---本地:实体。用户{{0 0001-01-01 00:00:00+0000 UTC 0001-01-01 00:00:00+0000 UTC}
---项目:实体。用户{{0 0001-01-01 00:00:00+0000 UTC 0001-01-01 00:00:00+0000 UTC}
---价值观
---本地:实体。用户{{1 0001-01-01 00:00:00+0000 UTC 0001-01-01 00:00:00+0000 UTC}测试1}
---项目:实体。用户{{0 0001-01-01 00:00:00+0000 UTC 0001-01-01 00:00:00+0000 UTC}
INFO[0000]User INFO User=“{{0 0001-01-01 00:00:00+0000 UTC 0001-01-01 00:00:00+0000 UTC}”用户id=1
(/home/mnv/go/src/billingo/model/repository/crudepository.go:29)
[2019-05-17 17:07:37]不支持的目标,应为切片或结构
项目
从服务线索传递到消息

不支持的目标,应为切片或结构


如何正确传递
,我需要类似于
本地
的行为?

Gorm不希望将数据解组到空接口类型中

即使您正在传递一个实现该特定接口的结构,它在传递后仍然保持作为接口的类型。您需要将
接口转换回您的
用户
结构

比如
项。(entity.User)

哦,我已经修好了

现在,使用
从服务调用存储库方法
查找

func(c CrudService)GetItem(id uint)entity.InterfaceEntity{
var item entity.User
返回c.repository.Find(id和项)
}
和存储库方法传递
,而不传递
&

func(c crudepository)Find(id uint,item entity.InterfaceEntity)entity.InterfaceEntity{
c、 db.First(项目,id)
退货项目
}

感谢您的回复<代码>项。(entity.User)
运行良好。但我需要创建更抽象的方法,这些方法不知道模型的类型。我是戈朗的新手。我可以使用类似于
item(reflect.TypeOf(item))
的东西吗?