Qualcuno potrebbe spiegare le differenze chiave tra os.Exit()
e panic()
e come vengono utilizzati nella pratica in Golang?Quando utilizzare os.Exit() e panic() in Golang?
risposta
Prima di tutto, ogni volta che si ha una domanda "come viene utilizzata nella pratica", un buon modo per iniziare è search il codice sorgente Go (o qualsiasi codice Go sufficientemente grande, in realtà) e lo package docs per risposte.
Ora, os.Exit
e panic
sono piuttosto diversi. panic
viene utilizzato quando il programma o la sua parte ha raggiunto uno stato irrecuperabile.
Quando
panic
viene chiamato, compreso implicitamente errori run-time come indicizzare una fetta fuori limite o, in mancanza di un tipo affermazione, si interrompe immediatamente l'esecuzione della funzione corrente ed inizia lo svolgimento stack del goroutine, correndo qualsiasi funzione differita lungo la strada. Se lo svolgimento raggiunge la cima dello stack della goroutine, il programma muore.
os.Exit
viene utilizzato quando è necessario interrompere il programma immediatamente, senza possibilità di recupero o l'esecuzione di una dichiarazione di clean-up differita, e anche restituire un codice di errore (che altri programmi possono utilizzare per segnalare quello che è successo). Questo è utile nei test, quando sai già che dopo questo test fallisce, anche l'altro fallirà, quindi potresti anche uscire ora. Questo può anche essere usato quando il tuo programma ha fatto tutto il necessario e ora deve solo uscire, cioè dopo aver stampato un messaggio di aiuto.
maggior parte del tempo non utilizzerà panic
(si dovrebbe restituire un error
invece), e quasi mai bisogno os.Exit
al di fuori di alcuni casi nei test e per la terminazione programma rapido.
"Questo è utile nei test, quando sai già che dopo questo test fallisce, anche l'altro avrà esito negativo ..." Questo odora di un test anti-pattern dei test dipendenti. In una suite di test ben scritta, ogni test è indipendente; l'esito di un determinato test non dovrebbe mai determinare l'esito di nessun altro test. – gotgenes
Prima di tutto, os.Exit()
può essere utilizzato per uscire normalmente dal programma senza errori, e il panico no, quindi questa è una distinzione chiave. Un altro è che il panico da qualche parte può essere catturato e ignorato o registrato usando recover
.
Ma se stiamo parlando di un codice di uscita errata, diciamo:
Usa panic
quando qualcosa va terribilmente male, probabilmente un errore di programmazione che avrebbe dovuto essere catturato prima di andare in produzione. Questo è il motivo per cui stampa lo stack.
Usa os.Exit(errorCode)
o qualcosa del genere, se si desidera:
controllo il codice di uscita del programma per scopi di scripting.
desidera un'uscita ordinata su un errore previsto (ad es. Errore di input dell'utente).
Quindi fondamentalmente il panico è per te, un codice di uscita errato è per il tuo utente.
Grazie molto utile!) –
"Quindi, in pratica, il panico è per te, un cattivo codice di uscita è per il tuo utente. " <- Suggerimento straordinario – psousa
- 1. testing.M recuperare in golang
- 2. Come disattivare "exit status 1" quando si esegue os.Exit (1)
- 3. Come trovarlo con id in golang e mongodb
- 4. Quando utilizzare JMS e quando utilizzare REST?
- 5. Come utilizzare Golang per comporre pacchetti TCP non elaborati (usando gopacket) e inviarli tramite socket raw
- 6. Timestamp di analisi completa in Golang
- 7. quando usare il dirottamento in golang?
- 8. Quando dovrei usare simultaneamente in golang?
- 9. carico e css in Golang
- 10. Come convertire int in bigint in golang?
- 11. È possibile utilizzare una dll in C# in un'applicazione golang
- 12. SSH inverso con golang
- 13. Quando utilizzare, non utilizzare, OneToOne e ManyToOne
- 14. Quando utilizzare Meteor.methods e utilizzare gli stub
- 15. Come utilizzare un percorso relativo per LDFLAGS in golang
- 16. Quando utilizzare e quando non utilizzare Python 3.5 `attendere '?
- 17. Quando utilizzare le categorie e quando utilizzare la sottoclasse?
- 18. Quando utilizzare l'array di byte e quando utilizzare lo streaming?
- 19. Segnali di cattura Golang
- 20. Quando utilizzare un modulo e quando utilizzare una classe
- 21. Quando utilizzare socket.io e quando usare ajax
- 22. Quando utilizzare @Version e @Audited in Hibernate?
- 23. Quando utilizzare UserControl e Control in Silverlight?
- 24. Quando utilizzare Class.isInstance() e quando utilizzare l'operatore instanceof?
- 25. Quando utilizzare limit e quando non su
- 26. golang TCPConn.SetWriteDeadline non sembra funzionare come previsto
- 27. Quando utilizzare IEnumerable e GetEnumerator?
- 28. Differenza tra [] uint8 && [] byte (Golang fette)
- 29. Quando utilizzare "nuovo" e quando non farlo, in C++?
- 30. Quando utilizzare le Proprietà e quando si Mappa in Java?
Solo un commento che si spera possa aiutare nella futura lettura del codice Go: in un sacco di codice di esempio, 'panic' viene utilizzato per uscire in errore, semplicemente perché è facile da capire ed elimina l'importazione di altri pacchetti . Questo * non significa che sia buono, o pratica idiomatica! *. È solo un dispositivo salvaspazio per esempio codice. IRL riserva 'panico' per * situazioni * molto * speciali. – Intermernet
Hm ..buona) in particolare l'abbreviazione "IRL" - è una novità per me :) Potresti spiegare in che modo il panico elimina l'importazione dei pacchetti? –
'panic' è un builtin. Si consiglia (a seconda delle circostanze) di utilizzare qualcosa come 'os.Exit',' log.Fatal' ecc., Che restituirà un codice di errore al sistema operativo (sempre consigliato se possibile). Tutto ciò comporta l'importazione di un pacchetto e quindi il codice di esempio "ingombrante". Il codice di esempio dovrebbe sempre essere preso solo per dimostrare una soluzione a un problema specifico. Potrebbero esserci altri problemi con il codice, che rendono il codice più complesso se adeguatamente dimostrato, e quindi a detrimento della spiegazione della risposta fornita. YMMV. – Intermernet