Тип reflect.StructField

Тип reflect.StructField представляет собой структуру, которая содержит метаинформацию об отдельном поле структуры. Он используется вместе с методом Field типа reflect.Type для получения информации о полях структуры во время выполнения. Основные поля этой структуры: Name (имя поля), Type (тип поля), Tag (строковый тег), Offset (смещение в байтах) и Anonymous (является ли поле анонимным).

Синтаксис

gotype StructField struct {
  Name    string
  Type    Type
  Tag     StructTag
  Offset  uintptr
  Anonymous bool
  // другие поля
}

Пример

Давайте получим информацию о полях структуры с помощью reflect.TypeOf и метода Field:

gopackage 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)
  }
}

Результат выполнения кода:

go"Field 0: ID, type: int, tag: json:\"id\""
"Field 1: Name, type: string, tag: json:\"name\""
"Field 2: Age, type: int, tag: "

Пример

Давайте проверим, является ли поле анонимным, используя поле Anonymous структуры StructField:

gopackage 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)
  }
}

Результат выполнения кода:

go"Field: Address, anonymous: true"
"Field: Name, anonymous: false"

Пример

Давайте получим смещение поля в структуре с помощью поля Offset:

gopackage 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)
  }
}

Результат выполнения кода:

go"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,
    который возвращает количество полей структуры