Instance new Type (Golang)

Qualcuno può dirmi come creare una nuova istanza di Type da una stringa? Riflettere?

Ci sono esempi ma sono per le versioni precedenti (pre Go 1) della lingua [:(]

Quindi, se comprendo correttamente la tua domanda, stai chiedendo come puoi creare un object quando hai solo il nome del tipo come stringa. Quindi, ad esempio, potresti avere una stringa “MyStruct” e vuoi creare un object di questo tipo.

Sfortunatamente, questo non è facilmente ansible perché Go è un linguaggio tipizzato staticamente e il linker elimina il codice morto (o parti inline di esso). Quindi, non vi è alcuna garanzia che il tuo eseguibile finale contenga anche il codice di “MyStruct”.

Tuttavia, è ansible mantenere una map[string]reflect.Type globale map[string]reflect.Type manualmente. Ad esempio inizializzando questa mappa nella funzione init() dei pacchetti che definisce tali tipi di rilevamento. Questo dirà anche al compilatore che stai usando i tipi. Successivamente, è ansible utilizzare questa mappa per cercare il reflect.Type del tipo che si desidera creare e utilizzare reflect.New per ottenere un puntatore a un nuovo object di quel tipo (memorizzato come reflect.Value). Puoi estrarre l’object in un’interfaccia con qualcosa del genere:

 reflect.New(yourtype).Elem().Interface() 

Elem () rimuoverà il puntatore e Interface () restituirà il valore riflesso come interface{} . Vedi Le leggi della riflessione per ulteriori dettagli.

PS: Potrebbe esserci un modo migliore per strutturare il tuo programma che non richiede nemmeno la riflessione e che consente al compilatore di rilevare più errori. Hai considerato di utilizzare un metodo di fabbrica, ad esempio? Un’altra soluzione facile potrebbe essere quella di mantenere una map[string]func() interface{} di funzioni che può essere invocata per creare un nuovo object con quel nome.

Factory con costruttori predefiniti può essere basato su qualcosa di simile:

 package main import ( "fmt" ) type Creator func() interface{} type A struct { a int } type B struct { a bool } func NewA() interface{} { return new(A) } func NewB() interface{} { return new(B) } func main() { m := map[string]Creator{} m["A"] = NewA m["B"] = NewB for k, v := range m { fmt.Printf("%v -> %v\n", k, v()) } }