我已经遇到过几次,它很容易解决,但我只是想知道当接口嵌入具有匹配方法签名的接口时,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 有重复的方法。在我看来,编译器解决这些方法相同且不存在冲突的事实是相当微不足道的,这将使这些模式更简单。
这里的解决方案很简单,但会导致一些重复,如果尝试从外部包包装接口,情况会变得更糟。
在嵌入接口时允许这种重复有什么缺点吗,也许我低估了编译器的复杂性?
更新 大多数评论似乎忽略了一个事实,即我提供的只是接口(也许我仍然遗漏了一些东西),为了清楚起见,现在包含示例用法的实现
相关分类