В чем причина существования этой функции?
В кодировке / json неэкспортированная функция refleValue передает все свои аргументы другой функции.
func(e *encodeState) reflectValue(v reflect.Value, opts encOpts)
{
valueEncoder(v)(e, v, opts)
}
Вызов valueEncoder может быть сделан из любого места, где вызывается refleValue. Какова мотивация для этой дополнительной функции?
2 ответа
Метод можно заменить прямыми вызовами valueEncoder(v)(e, v, opts)
, Метод не нужен для удовлетворения интерфейса, и к нему нельзя получить доступ через отражение.
Метод был гораздо дольше, еще в 2011 году. Текущий метод может быть там из-за прошлой истории. Также возможно, что автор подумал, что читаемость кода улучшается путем инкапсуляции valueEncoder(v)(e, v, opts)
в методе.
Я не знаю мотивацию автора этого кода. Но я предполагаю, что e.reflectValue() является вспомогательной функцией, которая делает этот код более точным и читабельным.
Когда я смотрю на определение этой функции:
func (e *encodeState) reflectValue(v reflect.Value, opts encOpts)
Для меня довольно ясно, что refleValue каким-то образом изменяет encodeState в зависимости от значенияоотражения и некоторых параметров кодирования.
Когда я смотрю на это определение:
func valueEncoder(v reflect.Value) encoderFunc
Я понятия не имею о том, что происходит, все, что я вижу, это функция высшего порядка.
Вызовы функций в golang стоят дорого, но ожидается, что пакет encoding/json не будет очень быстрым.