Подтвердить что ты не робот

Golang - Elem Vs Косвенный в пакете отражения

Из документов

func (v Value) Elem() Value

Элем возвращает значение, которое содержит интерфейс v или указывает указатель v. Это паника, если v Kind не является интерфейсом или Ptr. Он возвращает нулевое значение, если v равно нулю.

func Indirect(v Value) Value

Косвенное возвращает значение, которое указывает v. Если v является указателем nil, косвенный возвращает нулевое значение. Если v не является указателем, Indirect возвращает v.

Итак, можно ли смело предположить следующее?

reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem().

Является ли косвенным методом просто метод удобства для правой части выше?

4b9b3361

Ответ 1

Если a reflect.Value является указателем, то v.Elem() эквивалентно reflect.Indirect(v). Если это не указатель, то они не эквивалентны:

  • Если значение представляет собой интерфейс, то reflect.Indirect(v) вернет одно и то же значение, а v.Elem() вернет содержащееся динамическое значение.
  • Если значение - это что-то другое, тогда v.Elem() будет паниковать.

Помощник reflect.Indirect предназначен для случаев, когда вы хотите принять либо конкретный тип, либо указатель на этот тип. Одним из примеров является процедура преобразования database/sql: используя reflect.Indirect, он может использовать одни и те же пути кода для обработки различных типов и указателей для этих типов.