filmov
tv
Reflection (рефлексия)
![preview_player](https://i.ytimg.com/vi/qlBsWzuTEFU/sddefault.jpg)
Показать описание
Рефлексия или отображение - это один из видов метапрограммирования позволяющий нам в рантайме (ходе выполнения программы) определять типы данных переменных, поля структур и другую информацию, домтупную на этапе программирования, но не доступную, без рефлексии в рантайме. Рефлексия поможет Вам не дублировать Ваш код.
Удачи Вам в изучении программирования в целом и языка Го в частности, я постараюсь Вам в этом помочь )).
На этом канале будут околокомпьютерные видео, видео по обзорам железа софта и создания собственного софта.
Таймкоды:
00:00 - теория
00:41 - несколько функций решающих одну проблему
02:33 - описание рефлексии
04:12 - простой пример
05:28 - рефлексия для структур
06:34 - практика структурной рефлексии
08:56 - пример полезных функций с рефлексией
Примеры кода:
func isEmpty(val interface{}) bool {
return reflect.ValueOf(val).IsZero()
}
func setValue(structure interface{}, key string, value interface{}) {
if reflect.TypeOf(structure).Elem().Kind() == reflect.Struct {
elem := reflect.ValueOf(structure).Elem()
field := elem.FieldByName(key)
if field.CanSet() {
field.Set(reflect.ValueOf(value))
}
}
}
func getValue(structure interface{}, key string) interface{} {
var result interface{}
if reflect.TypeOf(structure).Elem().Kind() == reflect.Struct {
elem := reflect.ValueOf(structure).Elem()
field := elem.FieldByName(key)
if field.IsValid() {
result = field.Interface()
}
}
return result
}
func concat(a interface{}, b interface{}) interface{} {
if reflect.TypeOf(a).Kind() == reflect.Int && reflect.TypeOf(b).Kind() == reflect.Int {
return reflect.ValueOf(a).Int() + reflect.ValueOf(b).Int()
}
if reflect.TypeOf(a).Kind() == reflect.String && reflect.TypeOf(b).Kind() == reflect.String {
return reflect.ValueOf(a).String() + reflect.ValueOf(b).String()
}
return nil
}
Удачи Вам в изучении программирования в целом и языка Го в частности, я постараюсь Вам в этом помочь )).
На этом канале будут околокомпьютерные видео, видео по обзорам железа софта и создания собственного софта.
Таймкоды:
00:00 - теория
00:41 - несколько функций решающих одну проблему
02:33 - описание рефлексии
04:12 - простой пример
05:28 - рефлексия для структур
06:34 - практика структурной рефлексии
08:56 - пример полезных функций с рефлексией
Примеры кода:
func isEmpty(val interface{}) bool {
return reflect.ValueOf(val).IsZero()
}
func setValue(structure interface{}, key string, value interface{}) {
if reflect.TypeOf(structure).Elem().Kind() == reflect.Struct {
elem := reflect.ValueOf(structure).Elem()
field := elem.FieldByName(key)
if field.CanSet() {
field.Set(reflect.ValueOf(value))
}
}
}
func getValue(structure interface{}, key string) interface{} {
var result interface{}
if reflect.TypeOf(structure).Elem().Kind() == reflect.Struct {
elem := reflect.ValueOf(structure).Elem()
field := elem.FieldByName(key)
if field.IsValid() {
result = field.Interface()
}
}
return result
}
func concat(a interface{}, b interface{}) interface{} {
if reflect.TypeOf(a).Kind() == reflect.Int && reflect.TypeOf(b).Kind() == reflect.Int {
return reflect.ValueOf(a).Int() + reflect.ValueOf(b).Int()
}
if reflect.TypeOf(a).Kind() == reflect.String && reflect.TypeOf(b).Kind() == reflect.String {
return reflect.ValueOf(a).String() + reflect.ValueOf(b).String()
}
return nil
}
Комментарии