Heim >Backend-Entwicklung >Golang >Wie kann ich Funktionszeiger in Go zuverlässig auf Gleichheit vergleichen?

Wie kann ich Funktionszeiger in Go zuverlässig auf Gleichheit vergleichen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-18 09:35:11243Durchsuche

How Can I Reliably Compare Function Pointers for Equality in Go?

Zeigergleichheit für Funktionen in Go Weekly erkennen

Traditionell umfasste der Vergleich zweier Nicht-Null-Funktionszeiger in Go die Verwendung von ==- oder !=-Operatoren. Nach jüngsten Änderungen führt dieser Ansatz jedoch nun zu Fehlern.

Die Begründung hinter der Änderung

Die Abschaffung des Zeigergleichheitsvergleichs für Funktionen ergibt sich aus dem Konzept von Gleichheit vs. Identität. In Go bewerten die Operatoren == und != die Äquivalenz von Werten, nicht die Identität. Diese Unterscheidung soll Verwechslungen zwischen diesen Konzepten verhindern.

Leistungsüberlegungen

Darüber hinaus wirken sich Vergleiche von Funktionen auf die Leistung aus. Beispielsweise sollten anonyme Abschlüsse, die sich nicht auf externe Variablen beziehen, vom Compiler in einer einzigen Implementierung optimiert werden. Der Vergleich von Funktionszeigern würde diese Optimierung behindern und die dynamische Erstellung neuer Abschlüsse zur Laufzeit erfordern.

Verwendung des Reflect-Pakets

Obwohl es möglich ist, die Funktionsidentität mithilfe des Reflect-Pakets zu bestimmen, ist es wichtig, dies zu beachten Dieser Ansatz bringt undefiniertes Verhalten mit sich. Die Ergebnisse solcher Vergleiche sind unzuverlässig, da der Compiler möglicherweise beschließt, mehrere Funktionen in einer einzigen Implementierung zusammenzufassen.

Eine gültige Lösung

Um Funktionszeiger effektiv zu vergleichen, kann der folgende Ansatz verwendet werden:

package main

import "fmt"

func F1() {}
func F2() {}

var F1_ID = F1 // Assign a unique variable to F1
var F2_ID = F2 // Assign a unique variable to F2

func main() {
    f1 := &F1_ID // Take the address of F1_ID
    f2 := &F2_ID // Take the address of F2_ID

    // Compare pointers
    fmt.Println(f1 == f1) // Prints true
    fmt.Println(f1 == f2) // Prints false
}

Durch die Verwendung von Zeigern auf eindeutige Variablen, die jeder Funktion zugeordnet sind, können Sie Zeigergleichheit zwischen Funktionen effektiv erkennen.

Das obige ist der detaillierte Inhalt vonWie kann ich Funktionszeiger in Go zuverlässig auf Gleichheit vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn