Я не уверен, что это должны быть два отдельных вопроса или один, но мне кажется, что один вопрос состоит из двух частей. Как следует использовать интерфейсы go? У меня есть две проблемы:интерфейс golang, который зависит от интерфейса
Методы интерфейсов имеют глобальную область видимости: если у меня есть интерфейс A и интерфейс B, которые реализуют один и тот же метод Foo, но с разными аргументами или типами возврата, я не могу реализовать их как на то же время из того же типа. Например, у меня есть метод GetBytes() в одном интерфейсе с типом возвращаемого типа [], а в другом ([] байт, ошибка). Как я должен преодолеть эту проблему?
Еще одна проблема, с которой я сталкиваюсь, - это когда я пытаюсь определить интерфейс say interface A, у которого есть метод, который возвращает интерфейс B, определенный в том же слое. Теперь, если я хочу создать объект, который реализует A, если я возвращаю struct, который реализует B, то он недостаточно умен, чтобы вывести, что этот метод реализует метод в A, и это заставляет меня создавать зависимость от B. Это, кажется, полностью побеждает точка пути работы интерфейсов на первом месте. Как я могу избежать этой проблемы?
, например, если у меня есть:
type B interface {
Bar()
}
type A interface {
Foo() B
}
для следующих структур:
type b_impl struct{}
func (b b_impl) Bar() {}
type a_impl struct{}
Способ Foo
func (a a_impl) Foo() b_impl {}
не удовлетворяет интерфейсу и мне нужно сделать это:
func (a a_impl) Foo() B {}
, который создает зависимость от пакета, в котором объявлен B.
«Как я должен преодолеть эту проблему?» Вы не можете, так как Go не поддерживает перегрузку метода. См. Https://golang.org/doc/faq#overloading. Я не понимаю ваш второй вопрос достаточно хорошо, чтобы попытаться ответить. Возможно, поможет пример кода. – smarx
thanks @smarx - я отредактировал вопрос с более подробной информацией для второй части – gsf
Я не думаю, что вы можете сделать что-нибудь еще о своей второй проблеме. – smarx