为了账号安全,请及时绑定邮箱和手机立即绑定

冲突匹配的嵌入式接口方法是功能、错误还是其他?

冲突匹配的嵌入式接口方法是功能、错误还是其他?

Go
慕桂英546537 2023-04-17 15:18:30
我已经遇到过几次,它很容易解决,但我只是想知道当接口嵌入具有匹配方法签名的接口时,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
提交
取消
意见反馈 帮助中心 APP下载
官方微信