Ответ 1
Если a reflect.Value
является указателем, то v.Elem()
эквивалентно reflect.Indirect(v)
. Если это не указатель, то они не эквивалентны:
- Если значение представляет собой интерфейс, то
reflect.Indirect(v)
вернет одно и то же значение, аv.Elem()
вернет содержащееся динамическое значение. - Если значение - это что-то другое, тогда
v.Elem()
будет паниковать.
Помощник reflect.Indirect
предназначен для случаев, когда вы хотите принять либо конкретный тип, либо указатель на этот тип. Одним из примеров является процедура преобразования database/sql
: используя reflect.Indirect
, он может использовать одни и те же пути кода для обработки различных типов и указателей для этих типов.