Рефлексия в Go: reflect пакет, когда использовать
Вопрос
Что такое рефлексия в 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()?