パッケージfunc (v Value) FieldByName(name string) Value
から使用できます:reflect
FieldByName は、指定された名前の構造体フィールドを返します。フィールドが見つからない場合は、ゼロの値を返します。v の Kind が構造体でない場合はパニックになります。
この作業サンプル コードのように:
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
}
出力:
90210
tester
また、特殊なケースとして、次のfmt.Println(field(person, "person.address.zip"))
動作サンプル コードのように を使用できます (デモンストレーションのみ)。
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
}
出力:
90210
tester