Функция, которая возвращает указатель структуры как функцию, которая возвращает интерфейс - PullRequest
0 голосов
/ 27 марта 2019

У меня есть пакет, экспортирующий функцию, которая возвращает структурный указатель, которым я не могу управлять.Я хотел бы обернуть эту функцию, чтобы обеспечить шов зависимостей, чтобы я мог провести некоторое модульное тестирование.Идея в том, что я хочу подделать, а не то, что мне дает внешний пакет.

Пример выглядит следующим образом:

/////////////////////////////////////
// External Package I can't control.
/////////////////////////////////////
package ex
type Foo struct {
    v int
}

func (f *Foo) GetV() int {
    return f.v
}

func CreateFoo(v int) *Foo {
    return &Foo{v: v}
}

////////////////////////////////////
// Local Package I'm testing.
////////////////////////////////////
type IFoo interface {
    GetV() int
}

type factory = func(v int) IFoo
var factoryFn factory = ex.CreateFoo

Это приводит к ошибке: cannot use CreateFoo (type func(int) *Foo) as type func(int) IFoo in assignment

Поскольку я думаю, что *Foo является IFoo, почему бы и нет?Что мне не хватает?Есть ли способ добиться того, что я пытаюсь сделать, используя такой крючок?

Playground ссылка на пример: https://play.golang.org/p/FDckAQGNRgA

1 Ответ

1 голос
/ 27 марта 2019

Тип функции, возвращающий IFoo, отличается от типа, возвращающего функцию * Foo, даже несмотря на то, что Foo соответствует требованиям для IFoo, Go не поддерживает ковариацию для возвращаемого типа.

Вам нужно будет обернуть функцию

var factoryFn = func(v int) IFoo { return CreateFoo(v) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...