Метод reflect.Value.Field

Метод reflect.Value.Field возвращает значение поля структуры, представленное в виде reflect.Value, по порядковому индексу этого поля. В качестве единственного параметра метод принимает целое число int - индекс поля. Индексация полей начинается с нуля. Метод полезен для динамического доступа к полям структур во время выполнения программы без знания их типов на этапе компиляции. Если переданный индекс выходит за границы структуры, метод вызывает панику.

Синтаксис

govalue.Field(index int) reflect.Value

Пример

Получим значение первого поля структуры типа string и выведем его на экран:

gopackage main

import (
  "fmt"
  "reflect"
)

type User struct {
  Name string
  Age  int
}

func main() {
  u := User{Name: "John", Age: 30}
  val := reflect.ValueOf(u)

  nameField := val.Field(0)
  fmt.Println(nameField)
}

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

go"John"

Пример

Получим второе поле структуры, имеющее тип int, и проверим его тип с помощью метода Kind:

gopackage main

import (
  "fmt"
  "reflect"
)

type User struct {
  Name string
  Age  int
}

func main() {
  u := User{Name: "John", Age: 30}
  val := reflect.ValueOf(u)

  ageField := val.Field(1)
  fmt.Printf("Value: %v, Kind: %v\n",
    ageField, ageField.Kind())
}

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

go"Value: 30, Kind: int"

Пример

Попробуем получить значение поля по индексу, выходящему за пределы структуры. Это вызовет панику:

gopackage main

import (
  "fmt"
  "reflect"
)

type User struct {
  Name string
  Age  int
}

func main() {
  u := User{Name: "John", Age: 30}
  val := reflect.ValueOf(u)

  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Recovered panic:", r)
    }
  }()

  _ = val.Field(2)
  fmt.Println("This line won't be executed")
}

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

go"Recovered panic: reflect: Field index out of range"

Смотрите также

  • метод reflect.Value.FieldByName,
    который позволяет получить поле структуры по его имени
  • метод reflect.Type.Field,
    который возвращает информацию о поле по индексу на уровне типа
  • функцию reflect.ValueOf,
    которая создает значение reflect.Value из интерфейса
  • метод reflect.Type.FieldByName,
    который получает информацию о поле структуры по имени на уровне типа