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

如何扩展现有类型以符合接口

如何扩展现有类型以符合接口

Go
长风秋雁 2022-06-27 16:22:46
我Logger用这些方法定义了一个接口:type Logger interface {    Info(args ...interface{})    Warn(args ...interface{})    Error(args ...interface{})}现在,我想扩展log.Logger类型以符合这个接口。由于log.Logger没有定义这些方法,我需要实现它们。我试图通过添加新方法来扩展它:type LoggerImpl log.Loggerfunc (logger *LoggerImpl) Info(v ...interface{}) {    logger.Println(v)}func (logger *LoggerImpl) Warn(v ...interface{}) {    logger.Println(v)}func (logger *LoggerImpl) Error(v ...interface{}) {    logger.Println(v)}但似乎这是错误的方法,因为我收到一条错误消息logger.Println undefined (type *LoggerImpl has no field or method Println)。我尝试过的另一个解决方案是嵌入类型,但这也会返回错误:type LoggerImpl struct {    log.Logger}func (logger *LoggerImpl) Info(v ...interface{}) {    logger.Println(v)}func (logger *LoggerImpl) Warn(v ...interface{}) {    logger.Println(v)}func (logger *LoggerImpl) Error(v ...interface{}) {    logger.Println(v)}func initLogger() *LoggerImpl {    logger := log.New(os.Stdout, "", log.Lshortfile)    return logger}我在这里得到的错误是从initLogger函数返回记录器时:cannot use logger (variable of type *log.Logger) as *LoggerImpl value in return statement如何修改log.Logger类型以符合Logger接口?
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您不能为在不同包中声明的类型定义方法。但是,您可以定义一个新类型,将旧类型嵌入到新类型中,并为新类型定义新方法:


type LoggerImpl struct {

   *log.Logger

}



func (logger *LoggerImpl) Error(v ...interface{}) {

    logger.Logger.Println(v)

}


func initLogger() *LoggerImpl {

    logger := &LoggerImpl{Logger:log.New(os.Stdout, "", log.Lshortfile)}


    return logger

}

...


上面,LoggerImpl包含为 声明的所有方法log.Logger,以及您在此包中显式声明的方法。


一般来说:如果您将一个类型嵌入到另一个结构中,则封闭结构会获取为嵌入类型定义的所有方法。如果从另一种类型定义新类型,则新类型不会获得基类型的任何方法。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信