Изучая Go столкнулся с такой проблемой - не могу понять, как язык со статической типизацией поддерживает такие штуки, как рефлексия?
Именно на системном уровне.
Вот пример:
Нам прилетает неизвестный JSON. По идее мы должны создать структуру с полями, которые ожидаем в JSON, и только после этого распарсить.
НО
возможен вариант:
var f interface{}
err := json.Unmarshal(inputJSON, &f)
Магии, конечно, не бывает, но был бы благодарен, если кто-то объяснит.
Спасибо!
В качестве самого хорошего примера сереализации советую рассмотреть ffjson. Обычно, рефлексией читают поля структуры и их аннотации и опосля кэширует их, ffjson напротив идёт путём кодогенерации. В некоторых случаях (с использованием интерфейсов в структурах) этот подход может быть ещё медленнее чем родной Marshal(), а для большей части прикладных задач, ещё и с использованием SIMD инструкций с SSE4 или SSE2 при работе со строками, получается сравнительно быстро. Ещё стоит глянуть исходники gob энкодера и декодера и почитать статью.