Являются ли конфликтующие подходящие встроенные методы интерфейса функцией, ошибкой или другим? - PullRequest
0 голосов
/ 01 октября 2018

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

Например, если я хочу, чтобы несколько вариантов журнала работали с разными пакетами, но в конечном итоге я хотел бы использовать один и тот же регистратор, я мог бы попробовать что-то вроде этого:

type Logger interface {
    Print(v ...interface{})
    Printf(format string, v ...interface{})
}

type DebugLogger interface {
    Logger
    Debug(v ...interface{})
    Debugf(format string, v ...interface{})
}

type ErrorLogger interface {
    Logger
    Error(v ...interface{})
    Errorf(format string, v ...interface{})
}

type ErrorDebugLogger interface {
    ErrorLogger
    DebugLogger
}

type ErrorDebugLoggerImp struct{}
func (l *ErrorDebugLoggerImp) Debug(v ...interface{})                 {}
func (l *ErrorDebugLoggerImp) Debugf(format string, v ...interface{}) {}
func (l *ErrorDebugLoggerImp) Error(v ...interface{})                 {}
func (l *ErrorDebugLoggerImp) Errorf(format string, v ...interface{}) {}
func (l *ErrorDebugLoggerImp) Print(v ...interface{})                 {}
func (l *ErrorDebugLoggerImp) Printf(format string, v ...interface{}) {}

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

func p1.RegisterLogger(l Logger){}

func p2.RegisterLogger(l DebugLogger){}

func p3.RegisterLogger(l ErrorLogger){}

func p4.RegisterLogger(l DebugErrorLogger){}

Но это не сработает, потому что компилятор будет жаловаться, что ErrorDebugLogger имеет дублированные методы.Мне кажется, что для компилятора было бы довольно тривиально разрешить тот факт, что эти методы идентичны, и нет конфликта, и это упростит подобные шаблоны.

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

Есть ли минус в том, чтобы допускать такое дублирование при встраивании интерфейсов, возможноЯ недооцениваю сложность для компилятора?

ОБНОВЛЕНИЕ Большинство комментариев, казалось, пропускали тот факт, что все, что я предоставил, было интерфейсами (возможно, я все еще что-то упускаю), реализация теперь включена спример использования для наглядности

1 Ответ

0 голосов
/ 02 октября 2018

Эта проблема обсуждалась здесь: https://github.com/golang/go/issues/6977

Здесь, на SO, также есть вопрос о как решить проблему, возможно, вы найдете ответ полезным: Как бороться с дублирующимися методами в интерфейсе Go?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...