Пустой интерфейс — это интерфейс, который не содержит никаких методов. В Go он записывается как interface{}
(до Go 1.18) или any
(синоним, введенный в Go 1.18+).
var anyValue interface{} // Традиционная запись
var modernAny any // Современная запись (Go 1.18+)
Может хранить значение любого типа:
var i interface{}
i = 42 // int
i = "hello" // string
i = []byte{1, 2, 3} // slice
Используется в runtime:
eface
(empty interface)type eface struct {
_type *_type // Информация о типе
data unsafe.Pointer // Указатель на данные
}
Часто используется в:
fmt.Print
)func printAny(v interface{}) {
fmt.Printf("Тип: %T, Значение: %v\n", v, v)
}
var items []interface{}
items = append(items, 123)
items = append(items, "text")
items = append(items, true)
func analyze(v interface{}) {
t := reflect.TypeOf(v)
fmt.Println("Тип:", t.Name())
}
Требуется type assertion для работы с конкретным типом:
var val interface{} = "hello"
s, ok := val.(string) // Проверка типа
if ok {
fmt.Println(s) // Безопасное использование
}
Type switch для обработки разных типов:
switch v := val.(type) {
case int:
fmt.Println("Это int:", v)
case string:
fmt.Println("Это string:", v)
default:
fmt.Println("Неизвестный тип")
}
Производительность:
Характеристика | Обычный интерфейс (iface ) |
Пустой интерфейс (eface ) |
---|---|---|
Методы | Содержит методы | Нет методов |
Использование | Четкий контракт | Любые типы |
Runtime структура | iface (с itab ) |
eface (только тип) |
Функция fmt.Printf
:
func Printf(format string, a ...interface{}) (n int, err error)
Принимает переменное количество аргументов любого типа.
Пустой интерфейс — это мощный механизм Go для работы с типами в runtime, обеспечивающий гибкость в ситуациях, когда тип данных неизвестен на этапе компиляции. Однако его использование требует осторожности (проверки типов) и может влиять на производительность. В Go 1.18+ предпочтительно использовать псевдоним any
для лучшей читаемости кода.