Vergleichen von Funktionen in Go
In Go ist der Vergleich zweier Funktionswerte mithilfe von Standardvergleichsoperatoren nicht möglich. Es gibt jedoch alternative Methoden, um zu prüfen, ob Funktionen gleichwertig sind.
Funktionsadressen verwenden
Funktionswerte selbst sind nicht vergleichbar. Stattdessen können Sie die Adressen der Funktionswerte vergleichen, um festzustellen, ob sie sich auf dieselbe Funktion beziehen. Um die Adresse der Funktion zu erhalten, können Sie die Funktion Sprintf("%v") des fmt-Pakets verwenden:
<code class="go">hand := &Handler{Undefined, Defined} p1 := fmt.Sprintf("%v", Undefined) p2 := fmt.Sprintf("%v", hand.Get) if p1 == p2 { // Undefined and hand.Get refer to the same function. }</code>
Verwenden Sie „reflect.Value“
Ein anderer Ansatz besteht darin, Verwenden Sie den Typ „reflect.Value“, um den zugrunde liegenden Funktionszeiger abzurufen. Genau das macht das fmt-Paket intern:
<code class="go">value := reflect.ValueOf(Undefined) ptr := value.Pointer()</code>
Sie können dann die ptr-Werte vergleichen, um festzustellen, ob die Funktionen gleich sind.
Vorsicht
Es ist jedoch wichtig zu beachten, dass der Vergleich von Funktionsadressen nicht für alle Szenarien eine zuverlässige Methode ist. Funktionsabschlüsse und dynamisch generierte Funktionen können unterschiedliche Adressen haben, selbst wenn sie dieselbe Aufgabe ausführen.
Daher wird generell empfohlen, den Vergleich von Funktionsadressen zu vermeiden und stattdessen alternative Ansätze zum Vergleich des Funktionsverhaltens in Betracht zu ziehen, wie z. B. das Testen ihrer Eingaben und Ausgabewerte.
Das obige ist der detaillierte Inhalt vonWie können Sie Funktionen in Go vergleichen, wenn Standardvergleichsoperatoren nicht funktionieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!