2014-12-05 7 views

Odpowiedz

8

Zastosowanie 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 w komentarzach poniżej wskazał, że można uzyskać struct bez unsafe.Pointer za pomocą reflect.Indirect():

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

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

Plac zabaw: http://play.golang.org/p/z5xgEMR_Vx

+0

Czy to jedyna możliwość? Czy istnieje sposób bez użycia niebezpiecznej paczki? – yageek

+4

Aby zapobiec używaniu pakietu 'unsafe', powinieneś użyć metody' reflect.Indirect'. One-liner: 'reflect.Indirect (reflect.New (reflect.TypeOf (sometype) .Elem())) Interfejs(). (SomeType)' – Elwinar

+0

@Elwinar Neat. Będę edytować odpowiedź, aby dołączyć twoją wersję. –

Powiązane problemy