Метод reflect.Value.FieldByName

Метод reflect.Value.FieldByName возвращает значение поля структуры по его имени. Он принимает один параметр - строку с именем поля, а возвращает reflect.Value, представляющее значение этого поля. Если поле с указанным именем не найдено, возвращается нулевое значение reflect.Value, которое можно проверить с помощью метода IsValid.

Синтаксис

goval.FieldByName(name)

Пример

Давайте получим значение поля структуры по его имени:

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
  City string
}

func main() {
  p := Person{Name: "John", Age: 30, City: "New York"}
  val := reflect.ValueOf(p)

  nameField := val.FieldByName("Name")
  ageField := val.FieldByName("Age")
  cityField := val.FieldByName("City")

  fmt.Println(nameField.String())
  fmt.Println(ageField.Int())
  fmt.Println(cityField.String())
}

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

go"John"
30
"New York"

Пример с проверкой существования поля

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

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  p := Person{Name: "Alice", Age: 25}
  val := reflect.ValueOf(p)

  field := val.FieldByName("Name")
  if field.IsValid() {
    fmt.Println("Field exists:", field.String())
  } else {
    fmt.Println("Field does not exist")
  }

  invalidField := val.FieldByName("Address")
  if invalidField.IsValid() {
    fmt.Println("Field exists:", invalidField.String())
  } else {
    fmt.Println("Field does not exist")
  }
}

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

go"Field exists: Alice"
"Field does not exist"

Пример с изменением значения поля

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

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  p := Person{Name: "Bob", Age: 20}
  val := reflect.ValueOf(&p).Elem()

  nameField := val.FieldByName("Name")
  ageField := val.FieldByName("Age")

  if nameField.IsValid() && nameField.CanSet() {
    nameField.SetString("Robert")
  }

  if ageField.IsValid() && ageField.CanSet() {
    ageField.SetInt(35)
  }

  fmt.Printf("%+v\n", p)
}

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

go"{Name:Robert Age:35}"

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

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