2015-04-15 5 views
5

Go hat einen sehr unglücklichen Mangel an integrierten Assertions. Ich möchte, dass sie auf diese Weise implementieren:Optimiert Go nicht erreichbare if-Anweisungen?

const ASSERT = true 

func SomeFunction() { 
     if ASSERT && !some_condition_that_should_always_be_true() { 
       panic("Error message or object.") 
     } 
} 

Meine Frage wird die if-Anweisung, wenn ich const ASSERT = false definieren optimiert werden aus?

+3

Die Go-Spezifikation erzwingt keine Entfernung von toten Codes. Eine bestimmte Implementierung kann dies so aggressiv tun, wie sie es für richtig hält. – JimB

+1

@ JimB http://golang.org/ref/spec#Constant_expressions zur Kompilierzeit ausgewertet? – Uvelichitel

+1

@Uvelichitel: Ja, aber das hat nichts mit dem Entfernen von toten Codes zu tun. Der Compiler kann weiterhin den if-Block im kompilierten Objekt belassen. – JimB

Antwort

7

Wie von den Leuten in den Kommentaren zu Ihrer Frage erwähnt, ist es implementierungsspezifisch.

GC entfernt es. Sie können Ihr Programm mit -gcflags '-S' erstellen und sehen, dass der ASSERT Teil nicht in der Binärdatei ist.

z. kompilieren Sie den folgenden Code mit -gcflags '-S', und Sie werden sehen, dass der Code in den Zeilen 8 und 9 enthalten ist, aber ändern Sie Assert zu false, und sie werden nicht in der Asm-Liste sein.

package main 

const Assert = true 

var cond = true 

func main() { 
    if Assert && !cond { 
     panic("failed") 
    } 
} 

EDIT:

Was gccgo, entfernt er diesen Code bei -O1 und darüber. Sie können es sehen, durch den gleichen Code mit

go build -compiler gccgo -gccgoflags '-O1' main.go 

kompilieren und dann

objdump -S main 

die kommentierten Montage zu sehen, zu tun.

+0

Ich habe nie realisiert, dass 'objdump' eine' -S' Option hat, danke! (Und danke für die tatsächliche Antwort auch ...) – Matt