Метод reflect.Value.FieldByName
Метод reflect.Value.FieldByName возвращает значение поля структуры по его имени. Он принимает один параметр - строку с именем поля, а возвращает reflect.Value, представляющее значение этого поля. Если поле с указанным именем не найдено, возвращается нулевое значение reflect.Value, которое можно проверить с помощью метода IsValid.
Синтаксис
val.FieldByName(name)
Пример
Давайте получим значение поля структуры по его имени:
package 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())
}
Результат выполнения кода:
"John"
30
"New York"
Пример с проверкой существования поля
Давайте проверим, существует ли поле структуры с указанным именем:
package 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")
}
}
Результат выполнения кода:
"Field exists: Alice"
"Field does not exist"
Пример с изменением значения поля
Давайте изменим значение поля структуры, используя метод FieldByName:
package 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)
}
Результат выполнения кода:
"{Name:Robert Age:35}"
Смотрите также
-
метод
reflect.Value.Field,
который возвращает поле структуры по индексу -
метод
reflect.Type.FieldByName,
который возвращает информацию о поле структуры по имени -
метод
reflect.Value.IsValid,
который проверяет валидность значения -
метод
reflect.Value.CanSet,
который проверяет возможность изменения значения