首页 > 解决方案 > 无法在给定类型的类型定义上调用方法

问题描述

我正在使用 Google Wire 进行依赖注入,我想要 2 个记录器(错误和信息)。所以我创建了以下提供程序:

type errorLogger *log.Logger
type infoLogger  *log.Logger

type Logger struct {
  Error errorLogger
  Info  infoLogger
}

func ProvideLogger() *Logger {
  return &Logger{
    Error: log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile),
    Info:  log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime),
  }
}

在我的代码中,我这样引用记录器

h.Logger.Error

但是,这并没有让我像我想象的那样访问这些logger方法(例如PrintlnFatalf等)

在此处输入图像描述

我假设我引用的东西不正确,只是不确定是什么。

标签: gotypestype-definition

解决方案


定义为的新类型type errorLogger *log.Logger不继承基础类型的方法。

请参阅 Go 规范、类型声明 >类型定义

定义的类型可能具有与之关联的方法。它不继承绑定到给定类型的任何方法,但接口类型或复合类型元素的方法集保持不变

type Mutex struct         { /* Mutex fields */ }
func (m *Mutex) Lock()    { /* Lock implementation */ }
func (m *Mutex) Unlock()  { /* Unlock implementation */ }

// NewMutex has the same composition as Mutex but its method set is empty.
type NewMutex Mutex

// The method set of PtrMutex's underlying type *Mutex remains unchanged,
// but the method set of PtrMutex is empty.
type PtrMutex *Mutex

由此可见Printf和 其他*log.Logger方法不在 和的方法集中errorLoggerinfoLogger

您可以使用组合:

type errorLogger struct {
   *log.Logger
}

然后你可以初始化它:

&Logger{
    Error: errorLogger{
        Logger: log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile),
    },
}

推荐阅读