Неопределенная ошибка при вызове продвигаемой функции - PullRequest
0 голосов
/ 08 января 2019

Я получаю ошибку undefined при использовании продвинутой функции в GO.

import "log"
type logger struct {
    log.Logger
}

logError := logger.New(os.Stderr, "ERROR", log.LstdFlags)
logOut := logger.New(os.Stdout, "INFO", log.LstdFlags)

Это приводит к ошибке компилятора:

logger.go: logger.New undefined (type logger has no method New)

Однако, New является продвинутой функцией log.Logger. Что здесь не так?

1 Ответ

0 голосов
/ 08 января 2019

Не существует метода Logger.New(), только функция log.New(), которая возвращает значение *log.Logger:

func New(out io.Writer, prefix string, flag int) *Logger

Сгенерированный go doc преднамеренно перечисляет такие «конструкторские» функции под типом, который они возвращают, чтобы вы могли легко найти их, но эта группировка не делает их методами. log.New() не имеет приемника, поэтому он не может быть методом, только функцией.

Вы можете использовать log.New() для получения значения типа *log.Logger, которое при разыменовании дает значение типа log.Logger, значение, которое вы встраиваете.

Однако, если что-то передается вам как указатель в первую очередь, это явный признак того, что вы должны работать с ним как указатель (и не следует разыменовывать его). Поэтому я бы вставил *log.Logger, методы все равно будут продвигаться (потому что у них есть указатель приемника). Вот как вы можете инициализировать свои регистраторы:

type logger struct {
    *log.Logger
}

var logError = logger{
    Logger: log.New(os.Stderr, "ERROR", log.LstdFlags),
}

var logOut = logger{
    Logger: log.New(os.Stdout, "INFO", log.LstdFlags),
}

Хотя, если вы ничего не добавите к своему типу logger, я не вижу оправдания его существования, вы также можете использовать *log.Logger.

...