2014-07-07 18 views
6

W programie Go, jaki jest właściwy sposób ustawiania kodu zakończenia procesu?Prawidłowy sposób ustawiania kodu wyjścia?

Próbowałem zmieniając główny func do

func main() int { 
    return -1 
} 

Ale to powoduje błąd func main must have no arguments and no return values

OK więc jest os.Exit(code int), jednak natychmiast przerywa proces i nie wyjść czysto (bez deferreds prowadzone są na przykład).

Odkryłem także, że panic zakończy proces i ustawi kod statusu na niezerowy, może to być najlepszy sposób, chociaż zrzuca on ślad stosu do konsoli.

Jaki jest właściwy sposób ustawienia kodu wyjścia?

+0

Zastanawiam się również nad tym samym. Może ten wątek może pomóc: https://groups.google.com/forum/#!topic/golang-nuts/tPOFzJkkof8. Ale nie pomogło mi to zbytnio. – akonsu

Odpowiedz

8

Ustaw os.Exit ostatnią odroczoną funkcję wykonaną. Odroczone funkcje są wykonywane bezpośrednio przed powrotem funkcji otaczającej, w odwrotnej kolejności zostały odroczone. Na przykład,

package main 

import (
    "fmt" 
    "os" 
) 

func main() { 
    code := 0 
    defer func() { 
     os.Exit(code) 
    }() 
    defer func() { 
     fmt.Println("Another deferred func") 
    }() 
    fmt.Println("Hello, 世界") 
    code = 1 
} 

wyjściowa:

Hello, 世界 
Another deferred func 
[process exited with non-zero status] 

Go Playground:

http://play.golang.org/p/o0LfisANwb

The Go Programming Language Specification

Defer statements

A „odroczyć” oświadczenie wywołuje funkcję, której wykonanie jest odroczone do moment okolicznych zwrotów funkcyjnych, albo dlatego, że otaczający funkcja wykonany instrukcji return, dobiegł końca jego ciała funkcji, albo dlatego, że odpowiednia goroutine jest panika.

DeferStmt = "odroczyć" wyrażenie.

Wyrażenie musi być funkcją lub wywołaniem metody; nie może być nawiasowany. Połączenia wbudowanych funkcji są ograniczone tak jak dla instrukcji wyrażenia .

Za każdym razem, gdy wykonywane jest polecenie "odroczyć", wartości funkcji i parametry dla połączenia są obliczane jak zwykle i zapisywane od nowa, ale rzeczywisty korpus funkcji nie jest wykonywany. Zamiast tego funkcje odroczone są wykonywane natychmiast przed powrotem funkcji otaczającej, w kolejności odwrotnej zostały odroczone.

+1

Bardzo ładne! Nawet nie pojmowałem tego jako możliwości. –

Powiązane problemy