2014-06-20 10 views
13

Dalla documentazionegolang - Elem Vs indiretta nel pacchetto riflettere

func (v Value) Elem() Value 

Elem restituisce il valore che l'interfaccia v contiene o che i punti di puntatore v a. Si fa prendere dal panico se v Kind non è Interface o Ptr. Restituisce il valore zero se v è nullo.

func Indirect(v Value) Value 

rendimenti indiretta il valore che v punti. Se v è un puntatore nullo, Indirect restituisce un valore zero. Se v non è un puntatore, Indirect restituisce v.

Quindi posso tranquillamente assumere quanto segue?

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

è il metodo indiretto solo un metodo comodo per il lato destro di quanto sopra?

risposta

12

Se un reflect.Value è un puntatore, quindi v.Elem() equivale a reflect.Indirect(v). Se non è un puntatore, allora non sono equivalenti:

  • Se il valore è un'interfaccia quindi reflect.Indirect(v) restituirà lo stesso valore, mentre v.Elem() restituirà il valore dinamico contenuto.
  • Se il valore è qualcos'altro, allora lo stato di panico è v.Elem().

L'helper reflect.Indirect è destinato ai casi in cui si desidera accettare un determinato tipo o un puntatore a quel tipo. Un esempio sono le routine di conversione database/sql: utilizzando reflect.Indirect, può utilizzare gli stessi percorsi di codice per gestire i vari tipi e puntatori a questi tipi.