2014-12-05 3 views
6

Vorrei sapere se è possibile assegnare una struttura da un tipo specificato da un puntatore nil utilizzando reflect.New()Creare una nuova struct con riflettere dal tipo definito da un puntatore nullo

type SomeType struct{ 
    A int 
} 

sometype := (*SomeType)(nil) 

v := reflect.valueOf(sometype) 
// I would like to allocate a new struct based on the type defined by the pointer 
// newA := reflect.New(...) 
// 
newA.A = 3 

Come devo fare Questo ?

risposta

8

Uso reflect.Type.Elem():

s := (*SomeType)(nil) 
t := reflect.TypeOf(s).Elem() 

v := reflect.New(t) 
sp := (*SomeType)(unsafe.Pointer(v.Pointer())) 
sp.A = 3 

Playground: http://play.golang.org/p/Qq8eo-W2yq

EDIT: Elwinar nei commenti qui sotto ha sottolineato che è possibile ottenere lo struct senza unsafe.Pointer utilizzando reflect.Indirect():

s := (*SomeType)(nil) 
t := reflect.TypeOf(s).Elem() 

ss := reflect.Indirect(reflect.New(t)).Interface().(SomeType) 
ss.A = 3 

Parco giochi: http://play.golang.org/p/z5xgEMR_Vx

+0

È l'unica possibilità? C'è un modo senza usare il pacchetto non sicuro? – yageek

+4

Per evitare di dover utilizzare il pacchetto 'unsafe', è necessario utilizzare il metodo' reflect.Indirect'. One-liner: 'reflect.Indirect (reflect.New (reflect.TypeOf (sometype) .Elem())). Interface(). (SomeType)' – Elwinar

+0

@Elwinar Neat. Modificherò la risposta per includere la tua versione. –

Problemi correlati