error
не является особенным, за исключением того, что это интерфейс.
reflect.TypeOf
принимает один аргумент типа interface{}
. Если вы вызываете его с неинтерфейсным значением, значение и его тип будут заключены в interface{}
. Если вы вызываете его со значением интерфейса, базовое значение и тип извлекаются из интерфейса и переносятся в новое значение interface{}
. Если вы вызываете его с пустым интерфейсом (как вы делаете здесь, так как error
является интерфейсом и инициализируется нулем), тогда нет базового значения и типа, а аргумент reflect.TypeOf
является новым nil interface{}
значение. reflect.TypeOf
определено так, чтобы возвращать nil
в этом случае, что приводит к вашим нулевым проблемам.
Я думаю, что вы путаетесь в том, что TypeOf
значения интерфейса - это тип его базового значения, которое никогда не интерфейс. Вы бы хотели, чтобы TypeOf
значения интерфейса было самим типом интерфейса, но это не так.