1
0
mirror of https://github.com/golang/go synced 2024-10-03 06:21:21 -06:00

add FieldByName to the interface of reflect.StructType

R=rsc
DELTA=34  (33 added, 0 deleted, 1 changed)
OCL=31752
CL=31754
This commit is contained in:
Rob Pike 2009-07-16 18:21:14 -07:00
parent 1399badb02
commit a93c5c8550
2 changed files with 34 additions and 1 deletions

View File

@ -214,9 +214,18 @@ func TestAll(t *testing.T) { // TODO(r): wrap up better
styp := etyp.(*StructType);
f := styp.Field(0);
testType(t, 5, f.Type, "chan *int32");
f = styp.Field(1);
f, present := styp.FieldByName("d");
if !present {
t.Errorf("FieldByName says present field is absent");
}
testType(t, 6, f.Type, "float32");
f, present = styp.FieldByName("absent");
if present {
t.Errorf("FieldByName says absent field is present");
}
typ = Typeof(([32]int32)(nil));
testType(t, 7, typ, "[32]int32");
testType(t, 8, typ.(*ArrayType).Elem(), "int32");

View File

@ -455,6 +455,7 @@ type StructField struct {
Type Type;
Tag string;
Offset uintptr;
Index int;
Anonymous bool;
}
@ -482,6 +483,29 @@ func (t *StructType) Field(i int) (f StructField) {
return;
}
// FieldByName returns the field with the provided name and a boolean to indicate
// that the field was found..
func (t *StructType) FieldByName(name string) (f StructField, present bool) {
for i, p := range t.fields {
if p.name == nil || *p.name != name {
continue;
}
f.Name = *p.name;
f.Type = toType(*p.typ);
if p.pkgPath != nil {
f.PkgPath = *p.pkgPath;
}
if p.tag != nil {
f.Tag = *p.tag;
}
f.Offset = p.offset;
f.Index = i;
present = true;
break;
}
return;
}
// NumField returns the number of struct fields.
func (t *StructType) NumField() int {
return len(t.fields);