Я сталкивался с этим несколько раз, и его легко обойти, но мне просто интересно, есть ли какие-либо преимущества для компилятора 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 имеет дублированные методы.Мне кажется, что для компилятора было бы довольно тривиально разрешить тот факт, что эти методы идентичны, и нет конфликта, и это упростит подобные шаблоны.
Здесь решение тривиально, но приводит к некоторому дублированию, которое усугубляется при попытке обернуть интерфейсы из внешних пакетов.
Есть ли минус в том, чтобы допускать такое дублирование при встраивании интерфейсов, возможноЯ недооцениваю сложность для компилятора?
ОБНОВЛЕНИЕ Большинство комментариев, казалось, пропускали тот факт, что все, что я предоставил, было интерфейсами (возможно, я все еще что-то упускаю), реализация теперь включена спример использования для наглядности