2014-06-20 10 views
13

Od docsgolang - Elem Vs pośrednie w pakiecie odzwierciedlenia

func (v Value) Elem() Value 

Elem zwraca wartość, która zawiera interfejs v lub że punkty wskaźnik do v. Wpada w panikę, jeśli v's Kind nie jest Interface lub Ptr. Zwraca wartość zerową, jeśli v jest zerowe.

func Indirect(v Value) Value 

powraca Pośrednie wartości, jaką punktów V w. Jeśli v jest wskaźnikiem zerowym, Pośrednie zwraca wartość zerową. Jeśli v nie jest wskaźnikiem, pośrednie zwraca v.

Czy mogę więc bezpiecznie założyć następujące rzeczy?

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

Czy metoda pośrednia jest po prostu wygodną metodą dla prawej strony powyższego?

Odpowiedz

12

Jeśli wskaźnikiem jest reflect.Value, to v.Elem() jest równoważne reflect.Indirect(v). Jeśli nie jest to wskaźnik, to nie są one równoważne:

  • Jeśli wartość jest interfejsem następnie reflect.Indirect(v) zwróci tę samą wartość, natomiast v.Elem() zwróci zawartej wartość dynamiczną.
  • Jeśli wartością jest coś innego, wtedy v.Elem() wpadnie w panikę.

Pomocnik reflect.Indirect jest przeznaczony do przypadków, w których chcesz zaakceptować określony typ lub wskaźnik do tego typu. Jednym z przykładów jest procedura konwersji database/sql: przy użyciu reflect.Indirect może ona wykorzystywać te same ścieżki kodowe do obsługi różnych typów i wskaźników do tych typów.

Powiązane problemy