Невозможно вызвать методы для определения типа данного типа - PullRequest
0 голосов
/ 12 июля 2020

Я использую 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 как я предполагаю (например, Println, Fatalf et c)

введите описание изображения здесь

Я предполагаю, что ссылаюсь на что-то неправильно, просто не знаю, на что.

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Два новых типа регистраторов, errorLogger и infoLogger, являются новыми типами и не имеют методов базовых типов. Вы должны либо использовать тип регистратора напрямую, не создавая новые типы, либо определять новые типы регистратора с помощью внедрения. Когда вы определяете новый тип структуры и встраиваете средство ведения журнала, новый тип будет иметь методы встроенного типа. Когда вы определяете новый тип, как вы это делали, новый тип не будет иметь методов своего базового типа.

2 голосов
/ 12 июля 2020

Новые типы, определенные как 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 методов нет в наборе методов из errorLogger и infoLogger.

Вы можете использовать состав:

type errorLogger struct {
   *log.Logger
}

, а затем вы можете его инициализировать с:

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