这个功能存在的原因是什么?

时间:2017-02-04 20:04:37

标签: go indirection

encoding/json中,未导出的reflectValue函数将其所有参数传递给另一个函数。

func(e *encodeState) reflectValue(v reflect.Value, opts encOpts)       
{           
    valueEncoder(v)(e, v, opts)
}

可以从调用reflectValue的任何地方调用valueEncoder。这个附加功能的动机是什么?

2 个答案:

答案 0 :(得分:2)

可以通过直接调用valueEncoder(v)(e, v, opts)来替换该方法。该方法不需要满足接口,也不需要通过反射访问。

方法是much longer back in 2011。由于过去的历史,当前的方法可能在那里。作者还可能认为通过将valueEncoder(v)(e, v, opts)封装在方法中来提高代码可读性。

答案 1 :(得分:1)

我不知道此代码作者的动机。但我认为e.reflectValue()是一个辅助函数,它使这段代码更具有前提性和可读性。

当我看到这个功能的定义时:

func (e *encodeState) reflectValue(v reflect.Value, opts encOpts)

我很清楚,reflectValue会根据反射值和一些编码选项以某种方式更改encodeState。

当我看到这个定义时:

func valueEncoder(v reflect.Value) encoderFunc

我不知道发生了什么,我看到的只是一个高阶函数。

golang中的函数调用很昂贵,但编码/ json包的速度预计不会很快。