Тип reflect.StructField
Тип reflect.StructField представляет собой структуру,
которая содержит метаинформацию об отдельном поле структуры.
Он используется вместе с методом Field типа reflect.Type
для получения информации о полях структуры во время выполнения.
Основные поля этой структуры: Name (имя поля),
Type (тип поля), Tag (строковый тег),
Offset (смещение в байтах) и Anonymous
(является ли поле анонимным).
Синтаксис
type StructField struct {
Name string
Type Type
Tag StructTag
Offset uintptr
Anonymous bool
// другие поля
}
Пример
Давайте получим информацию о полях структуры
с помощью reflect.TypeOf и метода Field:
package main
import (
"fmt"
"reflect"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Age int
}
func main() {
user := User{ID: 1, Name: "John", Age: 30}
t := reflect.TypeOf(user)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fmt.Printf("Field %d: %s, type: %s, tag: %s\n",
i, field.Name, field.Type, field.Tag)
}
}
Результат выполнения кода:
"Field 0: ID, type: int, tag: json:\"id\""
"Field 1: Name, type: string, tag: json:\"name\""
"Field 2: Age, type: int, tag: "
Пример
Давайте проверим, является ли поле анонимным,
используя поле Anonymous структуры StructField:
package main
import (
"fmt"
"reflect"
)
type Address struct {
City string
}
type Person struct {
Address
Name string
}
func main() {
p := Person{Address: Address{City: "Moscow"}, Name: "Alex"}
t := reflect.TypeOf(p)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fmt.Printf("Field: %s, anonymous: %t\n",
field.Name, field.Anonymous)
}
}
Результат выполнения кода:
"Field: Address, anonymous: true"
"Field: Name, anonymous: false"
Пример
Давайте получим смещение поля в структуре
с помощью поля Offset:
package main
import (
"fmt"
"reflect"
)
type Data struct {
A bool
B int64
C string
}
func main() {
d := Data{A: true, B: 100, C: "test"}
t := reflect.TypeOf(d)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fmt.Printf("Field %s offset: %d bytes\n",
field.Name, field.Offset)
}
}
Результат выполнения кода:
"Field A offset: 0 bytes"
"Field B offset: 8 bytes"
"Field C offset: 16 bytes"
Смотрите также
-
тип
reflect.Type,
который представляет тип данных в рефлексии -
метод
reflect.Type.Field,
который возвращает информацию о поле по индексу -
метод
reflect.Type.FieldByName,
который возвращает информацию о поле по имени -
метод
reflect.Type.NumField,
который возвращает количество полей структуры