我已经遇到过几次了,它很容易解决,但是我只是想知道,当接口嵌入具有匹配方法签名的接口时,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有重复的方法。在我看来,这对于编译器解决这些方法是相同的且没有冲突的事实将是微不足道的,这将使此类模式更简单。
这里的解决方案很简单,但会导致某些重复,如果尝试从外部程序包包装接口,则会变得更糟。
在嵌入接口时是否存在允许这种重复的缺点,也许我低估了编译器的复杂性?
更新 大多数评论似乎都忽略了我所提供的只是接口(也许我仍然缺少某些东西)这一事实,为清楚起见,现在包括示例用法
答案 0 :(得分:2)
此问题已在此处讨论:https://github.com/golang/go/issues/6977
SO上还有一个关于如何解决问题的问题,也许您会找到有用的答案:How to deal with duplicate methods in Go interface?