Ответ
Рефлексия в Go — это механизм для анализа и изменения структуры данных во время выполнения программы. Пакет reflect позволяет проверять типы, значения, поля структур и методы объектов динамически.
Основные возможности:
- Проверка типа (
reflect.TypeOf) - Чтение/изменение значений (
reflect.ValueOf) - Обход полей структур, вызов методов
- Создание новых объектов
Пример:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
t := reflect.TypeOf(x) // int
v := reflect.ValueOf(x) // 42
fmt.Println(t, v) // int 42
// Изменение значения (требуется указатель)
p := reflect.ValueOf(&x)
e := p.Elem()
e.SetInt(24)
fmt.Println(x) // 24
}
Важно:
- Рефлексия медленнее статического кода
- Нарушает безопасность типов
- Сложна в отладке
- Используется в сериализации, ORM, шаблонах
Лучше избегать рефлексии там, где можно обойтись интерфейсами или кодогенерацией.