Что такое any, type assertion и type switch?
- Как узнать конкретный тип значения в интерфейсе?
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 минут бесплатно.