Sono nuovo di Go
e anche nuovi al concetto di reflection
, ma dovrebbe e può l'utilizzo di reflect pacchetto essere evitato nei Go
? C'è uno scenario in cui reflect
è inevitabile?L'uso della riflessione dovrebbe essere evitato in Go?
risposta
ci sono un paio di domini problema in cui la riflessione rende più facile scrivere le librerie riutilizzabili:
- marshalling/unmarshalling, un sacco di esempi nella libreria standard, per esempio
encoding/json
,encoding/xml
- formattazione, ad es.
text/template
,html/template
,fmt.Printf
.
Tuttavia c'è un prezzo da pagare per l'utilizzo di riflessione: errori di
- compilazione diventano errori di runtime (ad esempio
fmt.Printf("%d", stringVariable)
) - prestazioni diventa peggio
Molto spesso una soluzione alternativa esiste che non richiede la riflessione come la generazione del codice, che viene usata dalle librerie di marshalling come protobuf o parsimonia.
Sono d'accordo con @volker che si dovrebbe usare la riflessione solo quando si sa che semplificherà il codice già esistente e consapevole di tutti i lati negativi.
Evitare la riflessione.
Alcuni pacchetti (ad es. Fmt) non possono essere implementati senza riflessione poiché non è possibile eseguire l'attivazione di tipi di tutti i tipi esistenti e imminenti.
Se siete nuovi a Go: tenetevi lontano dal riflesso.
Vedo, grazie per il vostro feedback, molto apprezzato! – linirod
Grazie per il feedback kostya :) – linirod