Parametre olarak iletilen bir arabirimin tüm alanları arasında yinelenen bir işlev var. Bunu başarmak için yansıma kullanıyorum. Sorun, işaretçi olmayan bir alanın adresini nasıl alacağımı bilmem. Burada bir örnek verilmiştir: Yukarıdaki kod, test yapılarımı temsil eder. BuradaYansıma değerini kullanarak işaretçiyi göster
func InspectStruct(o interface{}) {
val := reflect.ValueOf(o)
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for i := 0; i < val.NumField(); i++ {
valueField := val.Field(i)
typeField := val.Type().Field(i)
address := "not-addressable"
if valueField.Kind() == reflect.Interface && !valueField.IsNil() {
elm := valueField.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
valueField = elm
}
}
if valueField.Kind() == reflect.Ptr {
valueField = valueField.Elem()
}
if valueField.CanAddr() {
address = fmt.Sprint(valueField.Addr().Pointer())
}
fmt.Printf("Field Name: %s,\t Field Value: %v,\t Address: %v\t, Field type: %v\t, Field kind: %v\n", typeField.Name,
valueField.Interface(), address, typeField.Type, valueField.Kind())
if valueField.Kind() == reflect.Struct {
InspectStruct(valueField.Interface())
}
}
}
Ve yapı örnekleme/başlatmasından sonra gerçek test edilir:
t := new(T)
t.Id = 1
t.F = *new(V)
t.F.Id = 2
t.F.F = *new(Z)
t.F.F.Id = 3
InspectStruct(t)
Ve InspectStruct aramanın sonunda çıkış Şimdi burada belirtilen bir yapıya geçtiği ve bununla ilgili bilgileri listeler gerçek fonksiyonudur :
Field Name: Id, Field Value: 1, Address: 408125440 , Field type: int , Field kind: int
Field Name: F, Field Value: {2 {3}}, Address: 408125444 , Field type: main.V , Field kind: struct
Field Name: Id, Field Value: 2, Address: not-addressable , Field type: int , Field kind: int
Field Name: F, Field Value: {3}, Address: not-addressable , Field type: main.Z , Field kind: struct
Field Name: Id, Field Value: 3, Address: not-addressable , Field type: int , Field kind: int
alanlara bir tür ardından yapı ise bunun için InspectStruct çağrı yüzden özyinelemeyi kullanıyorum görebileceğiniz gibi. Benim sorunum, tüm alanlar "t" hiyerarşisi için tüm başlatılmış olsa da, "t" daha yüksek bir derinlikte bulunan herhangi bir alan için adres alamıyorum. Herhangi bir yardım için minnettar olurum.
Bunun öğrendim, teşekkür: Bu değişiklikle birlikte
, seni bekliyoruz çıkışı olsun. – OneOfOne@OneOfOne cevabını tamamladığınız için teşekkür ederiz. Çok takdir! –