Вопрос с собеседования · Go

Что такое 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

Подробно

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.
  • Когда лучше дженерики.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗x.(string) без ok при несовпадении возвращает пустую строку
  • ✗any сохраняет проверку типов на этапе компиляции
  • ✓any — интерфейс без методов; x.(T) без ok при несовпадении паникует
  • ✗Type switch работает только с числовыми типами

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования