Получить доступ

Что такое any, type assertion и type switch?

JuniorМетоды и интерфейсы
Ещё спрашивают так:
  • Как узнать конкретный тип значения в интерфейсе?
Коротко

any (= interface{}) — интерфейс без методов, ему удовлетворяет любой тип. Достать конкретный тип — type assertion v, ok := x.(string) (без ok при несовпадении — panic) или type switch по нескольким типам.

  • Форма с ok безопасна, без ok — panic
  • any теряет проверку типов на этапе компиляции — с Go 1.18 часто лучше дженерики
  • Assertion к интерфейсу проверяет наличие методов: x.(io.Closer)

А ещё json.Unmarshal в any даёт map[string]any, []any, float64, string, bool, nil

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Type assertion проверяет во время выполнения, что динамический тип интерфейса совпадает с указанным (или реализует указанный интерфейс). Однозначная форма s := x.(string) паникует при несовпадении — используется, только когда тип гарантирован.

Type switch — несколько проверок подряд; в каждой ветке v имеет тип этой ветки.

Опциональные возможности. Частая идиома стандартной библиотеки — проверить, умеет ли значение больше базового интерфейса: io.Copy проверяет WriterTo и ReaderFrom, чтобы копировать эффективнее.

Пример

func describe(x any) string {
    switch v := x.(type) {
    case int:
        return fmt.Sprintf("число %d", v)
    case string:
        return "строка " + v
    case fmt.Stringer:
        return v.String()
    case nil:
        return "nil"
    default:
        return fmt.Sprintf("%T", v)
    }
}

if c, ok := r.(io.Closer); ok {
    defer c.Close()
}

Что хотят услышать

  • Что такое any.
  • Две формы assertion и type switch.
  • Когда лучше дженерики.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем