Go reflection interface{}?
Go - язык с относительно слабой типизацией. С - слабая система типов. Haskell - строго типизирован полноценной системой Хиндли-Милнер. В С что угодно можно передать пойнтером и в этом смысле любой код можно писать generic но unsafe, reflection невозможен. В Haskell все типизируется на этапе компиляции. Typechecker Haskell - это полноценная Тьюринг Машина, любой код generic и safe при этом, поэтому reflection просто не нужен. Go - прагматичный компромисс, на этапе компиляции передаваемый тип может быть неизвестен но всегда известен на этапе выполнения. В Go, runtime всегда знает тип всех данных отсюда и за этим reflection.
В качестве самого хорошего примера сереализации советую рассмотреть ffjson. Обычно, рефлексией читают поля структуры и их аннотации и опосля кэширует их, ffjson напротив идёт путём кодогенерации. В некоторых случаях (с использованием интерфейсов в структурах) этот подход может быть ещё медленнее чем родной Marshal(), а для большей части прикладных задач, ещё и с использованием SIMD инструкций с SSE4 или SSE2 при работе со строками, получается сравнительно быстро. Ещё стоит глянуть исходники gob энкодера и декодера и почитать статью.