Поля структуры через рефлексию в Go
Поля структуры можно перебрать по номеру и прочитать имя и значение. Для этого берут значение-обертку над переменной и считают, сколько полей у типа лежит внутри.
Имя поля читают у типа по тому же номеру,
а содержимое поля берут у значения. Для
просмотра достаточно обычной переменной.
Чтобы записать в поле, обертку строят
от указателя и снимают один уровень через
Elem.
Выведем имена и значения полей пользователя:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
}
func main() {
u := User{Name: "ann", Age: 20}
v := reflect.ValueOf(u)
for i := 0; i < v.NumField(); i++ {
name := v.Type().Field(i).Name
val := v.Field(i).Interface()
fmt.Println(name, val)
}
}
На экране две строки: имя и возраст в том порядке, как поля записаны в объявлении структуры. Номера полей начинаются с нуля и идут без пропусков.
Изменим возраст через указатель на значение:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
}
func main() {
u := User{Name: "max", Age: 30}
v := reflect.ValueOf(&u).Elem()
v.Field(1).SetInt(31)
fmt.Println(u.Age)
}
Дана структура:
type Tag struct {
Label string
}
t := Tag{Label: "go"}
Выведите имя единственного поля и его значение через перебор по номеру.
Дана структура:
type Pair struct {
First int
Second int
}
p := Pair{First: 3, Second: 7}
Скажите, какое имя вернется у поля с
номером 1 и какое значение у него
лежит в p.
Дано значение:
type User struct {
Name string
Age int
}
u := User{Name: "kate", Age: 19}
Запишите в поле возраста число 20
через обертку от указателя и выведите
u.Age.