Ich habe nicht viel darauf geachtet, aber ich bin gestolpert, also habe ich mir eine Notiz gemacht. Da die Paket- und Importanweisungen weggelassen werden, überprüfen Sie bitte den Link für den vollständigen Code.
Die Go-Version des folgenden Codes lautet "go1.14.9".
TL;DR ** Go hat keinen logischen Operator für die Bewertung von Kurzschlüssen. Wenn Sie also eine Funktion einschließen **
Angenommen, Sie haben folgenden Code:
https://play.golang.org/p/en49-fRSNLU
func main() {
funcCalled := true
funcCalled = funcCalled || returnFalse()
fmt.Println(funcCalled)
}
func returnFalse() bool {
fmt.Println("returnFalse() called")
return false
}
true
Program exited.
Ich wollte jedes Mal "returnFalse ()" aufrufen, bekam aber nie "returnFalse ()".
das ist**||
Ist die Kurzschlussauswertung und die linke Seite isttrue
Im Fall von wird die rechte Seite nicht ausgewertet und der Vorgang abgeschlossen.**ist.
DeshalbfuncCalled = funcCalled || returnFalse()
Ist
funcCalled: = true
--Die Verarbeitung ist abgeschlossen, ohne dass "returnFalse ()" auf der rechten Seite ausgewertet wird.Um returnFalse () aufzurufen, ist es im Allgemeinen
funcCalled = returnFalse() || funcCalled
Schreiben Sie zuerst den Funktionsaufruf wie|
, der keine Kurzschlussauswertung ist **Ändern Sie zu einem von.
Erstens 1, wenn die Funktion im Voraus aufgerufen und ausgewertet wird.
https://play.golang.org/p/EKTl6cQqsmx
func main() {
funcCalled := true
result := returnFalse() //Vorab auswerten
funcCalled = result || funcCalled
fmt.Println(funcCalled)
}
func returnFalse() bool {
fmt.Println("returnFalse() called")
return false
}
returnFalse() called
true
Program exited.
Es ist in Ordnung.
Als nächstes wird zuerst der Funktionsaufruf von 2 beschrieben.
https://play.golang.org/p/Iq2jqGVE1j7
func main() {
funcCalled := true
funcCalled = returnFalse() || funcCalled //Schreiben Sie zuerst den Funktionsaufruf
fmt.Println(funcCalled)
}
func returnFalse() bool {
fmt.Println("returnFalse() called")
return false
}
returnFalse() called
true
Program exited.
Sieht gut aus.
Schließlich, wenn Sie den logischen Operator |
verwenden, der keine Kurzschlussauswertung von 3 ist.
https://play.golang.org/p/aNMVkYBw7LI
func main() {
funcCalled := true
funcCalled = funcCalled | returnFalse() //Verwenden Sie Operatoren, die keine Kurzschlussauswertung sind
fmt.Println(funcCalled)
}
func returnFalse() bool {
fmt.Println("returnFalse() called")
return false
}
./prog.go:9:26: invalid operation: funcCalled | returnFalse() (operator | not defined on bool)
Go build failed.
Ich habe einen Fehler bekommen. Ist es nicht definiert?
Werfen wir einen Blick auf die Sprachspezifikationen.
https://golang.org/ref/spec#Logical_operators
Logical operators apply to boolean values and yield a result of the same type as the operands. The right operand is evaluated conditionally.
&& conditional AND p && q is "if p then q else false"
|| conditional OR p || q is "if p then true else q"
! NOT !p is "not p"
Es schien nicht definiert zu sein.
** Go hat keinen logischen Operator für die Bewertung von Kurzschlüssen. Wenn Sie also eine Funktion einschließen **
Recommended Posts