Рефлексия в Go: reflect пакет, когда использовать

К вопросам
Сложный
Advanced Features

Вопрос

Что такое рефлексия в Go? Как работает reflect пакет? В каких случаях стоит использовать рефлексию?

Ответ

Рефлексия позволяет: - Исследовать типы во время выполнения - Получать и изменять значения через интерфейсы - Вызывать методы динамически Основные типы: - reflect.Type - информация о типе - reflect.Value - значение и операции над ним - reflect.Kind - базовый тип (int, string, struct, etc.) Когда использовать: - Сериализация/десериализация - ORM библиотеки - Инжекция зависимостей

func inspectStruct(v interface{}) {
    val := reflect.ValueOf(v)
    typ := reflect.TypeOf(v)
    
    if typ.Kind() == reflect.Ptr {
        val = val.Elem()
        typ = typ.Elem()
    }
    
    for i := 0; i < val.NumField(); i++ {
        field := val.Field(i)
        fieldType := typ.Field(i)
        
        fmt.Printf("%s: %v (type: %s)
", 
            fieldType.Name, 
            field.Interface(), 
            field.Type())
    }
}

type User struct {
    Name string
    Age  int
}

func main() {
    user := User{Name: "John", Age: 30}
    inspectStruct(user)
}
func inspectStruct(v interface{}) {
    val := reflect.ValueOf(v)
    typ := reflect.TypeOf(v)
    
    if typ.Kind() == reflect.Ptr {
        val = val.Elem()
        typ = typ.Elem()
    }
    
    for i := 0; i < val.NumField(); i++ {
        field := val.Field(i)
        fieldType := typ.Field(i)
        
        fmt.Printf("%s: %v (type: %s)
", 
            fieldType.Name, 
            field.Interface(), 
            field.Type())
    }
}

type User struct {
    Name string
    Age  int
}

func main() {
    user := User{Name: "John", Age: 30}
    inspectStruct(user)
}

Дополнительные вопросы

Как работают reflect.Value.CanSet()? Что такое reflect.DeepEqual()?