Go hatte keinen logischen Operator für die Bewertung von Kurzschlüssen

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 **

Stolperpunkt

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 isttrueIm Fall von wird die rechte Seite nicht ausgewertet und der Vorgang abgeschlossen.**ist.

DeshalbfuncCalled = funcCalled || returnFalse()Ist

Lösung

Um returnFalse () aufzurufen, ist es im Allgemeinen

  1. ** Rufen Sie die Funktion im Voraus auf und werten Sie sie aus **
  2. funcCalled = returnFalse() || funcCalledSchreiben Sie zuerst den Funktionsaufruf wie
  3. ** Verwenden Sie den logischen Operator |, 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.

Fazit

** Go hat keinen logischen Operator für die Bewertung von Kurzschlüssen. Wenn Sie also eine Funktion einschließen **

Recommended Posts

Go hatte keinen logischen Operator für die Bewertung von Kurzschlüssen