我已经遇到过几次,它很容易解决,但我只是想知道当接口嵌入具有匹配方法签名的接口时,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 回答
- 0 关注
- 85 浏览
添加回答
举报
0/150
提交
取消