golang的反射很慢,这个和它的api设计有关。
type_ := reflect.ValueOf(obj)
fieldValue := type_.FieldByName("hello")
这里取出来的fielValue类型是reflect.Value,它是一个具体的值,而不是一个可复用的反射对象。这样每次反射都需要malloc这个reflect.Value结构体。
Jsoniter是golang是实现的,基于反射的JSON解析器。其实原理是用reflect.Type得出来的信息来直接做反射。而不依赖于reflect.ValueOf。
具体做法
结构体
1.利用refect.StructField取得对象上的值,对应的代码在: go/feature_reflect_object.go at master · json-iterator/go · GitHub:
fieldPtr := uintptr(structPtr) + field.Offset
在reflect.StructField上有一个Offset的属性。利用这个可以计算出字段的指针值。测试示例:
type TestObj struct {
field1 string
}
struct_ := &TestObj{}
field, _ := reflect.TypeOf(struct_).Elem().FieldByName("field1