Определение типа функции, которая возвращает часть интерфейсов - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел бы определить тип обработчика, который возвращает часть интерфейсов, аналогично следующему примеру:

package main

import "fmt"

type PersonInterface interface {
    GetName() string
}

type Person struct {
    Name string
}

func (person *Person) GetName() string {
    return person.Name
}

type PersonGetter func() []Person

func pg() []*Person {
    return []*Person{&Person{Name: "John Doe"}}
}

func main() {
    var person PersonInterface
    person = &Person{"John Doe"}
    fmt.Println(person)

    var personGetter PersonGetter
    personGetter = pg
}

Однако, если я запускаю это, я получаю

cannot use pg (type func() []*Person) as type PersonGetter in assignment

Как бы я определить общий тип функции, который возвращает часть интерфейсов? (Я прочитал https://github.com/golang/go/wiki/InterfaceSlice, но я не уверен, как применить это здесь).

1 Ответ

2 голосов
/ 13 февраля 2020

Даже если тип X реализует интерфейс I, []X нельзя присвоить []I. []X и []I структурно отличаются, []X содержит срез X с, а []I содержит срезы интерфейсов, которые фактически являются парами значений, каждое из которых указывает на базовые данные и тип.

Чтобы сделать то, что вам нужно, вам нужно изменить объявление функции, чтобы оно возвращало часть значений интерфейса:

func pg() []PersonInterface {
    return []PersonInterface{&Person{Name: "John Doe"}}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...