Я новичок в работе и хочу сделать два пакета с (очень) слабо связанным 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..
}