You can use func (v Value) FieldByName(name string) Value from the reflect package:
FieldByName returns a struct field with the given name. It returns a null value if the field is not found. This is panic if v Kind is not a structure.
Like this working code example:
package main import "fmt" import "reflect" func main() { person := Person{} person.name = "testing" person.address.street = "123 test st" person.address.city = "tester" person.address.zip = 90210 person.billing.address.same = true v := reflect.ValueOf(person) f := v.FieldByName("address") key := f.FieldByName("zip") fmt.Println(key) // 90210 fmt.Println(f.FieldByName("city")) // tester } type Person struct { name string address Address billing Billing } type Billing struct { address Address } type Address struct { street, city string zip int same bool }
output:
90210 tester
And for your special occasion, you can use fmt.Println(field(person, "person.address.zip")) , as this working code example (just for demonstration):
package main import "fmt" import "reflect" import "strings" func field(t interface{}, key string) reflect.Value { strs := strings.Split(key, ".") v := reflect.ValueOf(t) for _, s := range strs[1:] { v = v.FieldByName(s) } return v } func main() { person := Person{} person.name = "testing" person.address.street = "123 test st" person.address.city = "tester" person.address.zip = 90210 person.billing.address.same = true fmt.Println(field(person, "person.address.zip")) //90210 fmt.Println(field(person, "person.address.city")) //tester } type Person struct { name string address Address billing Billing } type Billing struct { address Address } type Address struct { street, city string zip int same bool }
output:
90210 tester
user6169399
source share