len()
auf einem Slice wird vom Compiler optimiert, es ist so, als würde man auf eine lokale Variable zugreifen. Es ist nicht wirklich ein Funktionsaufruf.
Sie können bestätigen mit:
%Vor%Und dann schauen Sie sich die Compiler-Ausgabe an:
$ go tool 6g -S x.go
%Vor% Beachten Sie den Aufruf von fmt.Println
, aber keinen Aufruf von len
.
Probieren Sie ein Experiment! Ссылка
Oder lesen Sie die Dokumentation: Ссылка (TL; DR: "Die Bedingung wird vor jeder Iteration ausgewertet.")
In Ihrem Beispiel ist len Teil der Bedingung, daher wird es vor jeder Iteration ausgewertet. Es wird eine Iteration geben für die sechs Male, die die Bedingung als wahr ausgewertet wird, dann eine weitere Auswertung, bei der sie als falsch ausgewertet wird und die for-Schleife endet. Also, insgesamt sieben Mal.
Ein zweites Experiment:
%Vor%Ausgabe:
%Vor%Es gibt einen Grund dafür, die Aufrufe von len () nicht zu optimieren.
Aus algorithmischer Sicht wird die Bedingung für jeden Schritt der Schleife für ausgewertet. In diesem Fall scheint es das Sechsfache der Bewertung der len (p) zu sein.
Tags und Links go