Утиная печать: как неявно конвертировать интерфейс в другой интерфейс - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в работе и хочу сделать два пакета с (очень) слабо связанным API между пользователем и поставщиком.Для этого я хочу использовать возможность go для неявной реализации интерфейсов и неявного преобразования.

И у провайдера, и у пользователя есть свои собственные определенные интерфейсы (например, провайдер возвращает провайдера. А пользователь принимает пользователя. А).С помощью этого шаблона я могу конвертировать из одного типа в другой вместо импорта интерфейсов из другого пакета.

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

Почему не разрешено такое преобразование?Есть ли обходной путь?

рабочий пример:

package main

// Provider

type A interface{
    AddString(string)
}


type a struct{
    b string
}
func (a *a) AddString(b string) {
    a.b = b
}
func NewA() A {
    return &a{nil}
}


// User

type A2 interface{
    AddString(string)
}

func Main() {
    var _ A2 = NewA()
}

пример, вызывающий проблемы:

package main

// Provider

type A interface{
    AddB(B)
}
type B interface{}


type a struct{
    b B
}
func (a *a) AddB(b B) {
    a.b = b
}
func NewA() A {
    return &a{nil}
}


// User

type A2 interface{
    AddB(B2)
}
type B2 interface{}

func Main() {
    var _ A2 = NewA() // error..
}

1 Ответ

0 голосов
/ 22 ноября 2018

Go обеспечивает проверку типов как функцию, а не ошибку.Когда вы объявляете B и B2 отдельными типами, компилятор учитывает это различие и обрабатывает их по-разному.

Знакомый пример - time.Duration, который является просто int64 для подсчета наносекунд, но вы не можете смешиватьи сопоставьте переменные int64 и time.Duration без явного преобразования типа. см. Time.Duration docs

Вместо того, чтобы пытаться обойти функцию проверки типов в Go, вы должны попытаться научиться выражать свой алгоритм с помощью идиоматического Go.

...