2017-02-04 3 views
2

В encoding/json неэкспортированная функция reflectValue передает все свои аргументы другой функции.В чем причина существования этой функции?

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

Звонок для valueEncoder может быть сделан из любой точки, где вызывается displayValue. Какова мотивация этой дополнительной функции?

ответ

2

Метод может быть заменен прямыми вызовами на valueEncoder(v)(e, v, opts). Этот метод не нужен для удовлетворения интерфейса, и он не получает доступа через отражение.

Способ был much longer back in 2011. Текущий метод может быть из-за прошлой истории. Также возможно, что автор считал, что читаемость кода улучшается путем инкапсуляции valueEncoder(v)(e, v, opts) в метод.

1

Я не знаю мотивации автора этого кода. Но я полагаю, что e.reflectValue() является вспомогательной функцией, которая делает этот код более надежным и читаемым.

Когда я смотрю на определение этого fucntion:

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

Это довольно ясно, что reflectValue каким-то образом изменяет encodeState на основе отражают значение и некоторые параметры кодирования.

Когда я смотрю на эту Defintion:

func valueEncoder(v reflect.Value) encoderFunc 

Я не имею ни малейшего представления о том, что происходит, все, что я вижу, это функция высшего порядка.

Функциональные вызовы дороги в голанге, но пакет кодирования/json не ожидается очень быстро.

Смежные вопросы