В чем причина существования этой функции?

В кодировке / 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 не будет очень быстрым.

Другие вопросы по тегам