Как может структура реализовывать интерфейс, не реализовав все методы интерфейса?

Создаю свой хендлер для логирования, свомощью пакета slog. По докам я должен реализовать интерфейс Handler. То есть его 4 метода:

  • Enabled(context.Context, Level) bool
  • Handle(context.Context, r Record) error
  • WithAttrs(attrs []Attr) Handler
  • WithGroup(name string) Handler

Но я пишу такой код:

import (
    "context"
    "log/slog"
    "os"
)

type MyHandler struct {
    slog.Handler
}

func (h MyHandler) Handle(ctx context.Context, r slog.Record) error {
    return h.Handler.Handle(ctx, r)
}

func main() {
    // создаю хендлер
    h := &MyHandler{slog.NewJSONHandler(os.Stdout, nil)}
    logger := slog.New(h)
    logger.Info("Message")
    // {"time":"2024-07-04T10:28:45.278528589+04:00","level":"INFO","msg":"Message"}
}

Функция slog.New() принимать только Handler. Для своей структуры MyHandler я реализовал только метод Handle и остальные не реализовал. Значит она не может реализовывать интерфейс Handler. Но все работает. Как это может быть? Компилятор должен послать меня.


Ответы (1 шт):

Автор решения: Xander

Вы внутри своей структуры используете slog.Handler. Таким образом ваш хэндлер получает автоматом все методы, которые поддерживает slog.Handler

→ Ссылка