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

What's a reason for this function to exist?

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

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

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

我不知道这段代码作者的动机。但我想 e.reflectValue() 是一个辅助函数,它使这段代码更简洁和可读。

当我查看这个函数的定义时:

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

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

当我看到这个定义时:

func valueEncoder(v reflect.Value) encoderFunc

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

函数调用在 golang 中很昂贵,但 encoding/json 包预计不会很快。

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

方法是much longer back in 2011。目前的方法可能是因为过去的历史。也有可能是作者认为把valueEncoder(v)(e, v, opts)封装在一个方法中,提高代码可读性。