反射

清空 struct

func clear(v interface{}) {
    p := reflect.ValueOf(v).Elem()
    p.Set(reflect.Zero(p.Type()))
}

深度相等判断

来自reflect包的DeepEqual函数可以对两个值进行深度相等判断。DeepEqual函数使用内建的==比较操作符对基础类型进行相等判断,对于复合类型则递归该变量的每个基础类型然后做类似的比较判断

反射为什么慢?

得到 type 信息的速度是很快的,向 jsoniter 这种库就是得到 type 中的 reflect.StructField 的 offset 偏移量,根据这个偏移量直接取得对象的值

如果每次反射得到的是值,那么就会得到 reflect.Value 对象,它并不是一个可复用的反射对象,因此每次都需要 malloc 一个 value 结构体,而且反射的时候还会涉及到遍历和比较的操作,尤其是比较操作中可能还会有字符串的比较,这些也都会占用一定的CPU时间,这是导致反射慢的根本原因