golang 提高反射性能

Go语言的反射性能通常较慢,主要由于reflect.Value在每次反射时都会malloc新的结构体。Jsoniter库通过使用reflect.Type信息直接进行反射,避免了这一问题。文章介绍了如何通过reflect.StructField的Offset属性获取结构体字段的指针值,以及处理slice和interface{}的方法,但Map类型仍需依赖Go的默认值反射API。
摘要由CSDN通过智能技术生成

    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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值