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

我已经遇到过几次,它很容易解决,但我只是想知道当接口嵌入具有匹配方法签名的接口时,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 有重复的方法。在我看来,编译器解决这些方法相同且不存在冲突的事实是相当微不足道的,这将使这些模式更简单。


这里的解决方案很简单,但会导致一些重复,如果尝试从外部包包装接口,情况会变得更糟。


在嵌入接口时允许这种重复有什么缺点吗,也许我低估了编译器的复杂性?


更新 大多数评论似乎忽略了一个事实,即我提供的只是接口(也许我仍然遗漏了一些东西),为了清楚起见,现在包含示例用法的实现


慕桂英546537
浏览 86回答 0
0回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go