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
- 1. Perché dovrebbe @@ class_variables essere evitato in Ruby?
- 2. dovrebbe essere evitato il boxing automatico in Java
- 3. Cosa C++ caratteristiche dovrebbe essere evitato per lo sviluppo embedded
- 4. Può essere evitato il rehashing in hashmap?
- 5. Come dovrebbe essere il corpo della richiesta?
- 6. Chi dovrebbe essere responsabile della selezione della classe derivata appropriata?
- 7. Dovrebbe essere in un namespace?
- 8. WebView si espande all'infinito - come può essere evitato?
- 9. Perché pos_tag() è così dolorosamente lento e può essere evitato?
- 10. Dove dovrebbe essere Android.mk?
- 11. Appropriatezza della riflessione Java
- 12. dovrebbe essere chiuso Class.getResourceAstream?
- 13. Cosa dovrebbe essere hadoop.tmp.dir?
- 14. C#: Come dovrebbe essere implementato ToString()?
- 15. Uso efficiente della riflessione in C#
- 16. Potrebbe essere più efficiente in Go?
- 17. Questo bug dovrebbe essere risolto?
- 18. Quale dovrebbe essere il timeout della connessione ideale nell'applicazione asp.net?
- 19. AssemblyInfo.cs dovrebbe essere inserito nel controllo della versione?
- 20. Chi dovrebbe essere responsabile della chiusura di un flusso
- 21. Dovrebbe essere std :: atomic volatile?
- 22. Dovrebbe essere verificato umbraco e umbraco_client nel controllo della fonte?
- 23. La * .datasource dovrebbe essere ignorata nel controllo della versione?
- 24. Dovrebbe essere incluso Gemfile.lock in .gitignore?
- 25. dovrebbe mai essere usato encodeURI?
- 26. Pylint: l'importazione relativa dovrebbe essere
- 27. dove dovrebbe essere "incluso" essere inserito in C++
- 28. WCF cosa dovrebbe essere endpointConfigurationName?
- 29. Dovrebbe essere smaltito un UdpClient?
- 30. Ottieni il nome della funzione utilizzando la riflessione in Golang
Grazie per il feedback kostya :) – linirod