Голанг с ГОРМ. Как правильно передать тип модели в метод? - PullRequest
0 голосов
/ 17 мая 2019

у меня следующая модель 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)
}

Кажется, что 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 передаваемый из сервиса приводит к сообщению

неподдерживаемый пункт назначения, должен быть фрагмент или структура

Как правильно передать item, мне нужно поведение как с local?

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Горм не хочет разархивировать данные в ваш пустой тип интерфейса.

Даже если вы передаете структуру, которая реализует этот конкретный интерфейс, она все равно остается типизированной как интерфейс после передачи. Вам необходимо преобразовать этот item интерфейс обратно в User структуру.

Нравится item.(entity.User)

0 голосов
/ 18 мая 2019

О, я исправил это.

Теперь метод репозитория 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
}
...