Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpRfFd 145 of 280 menu
◀ ▶

Поля структуры через рефлексию в 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить