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

Wie kann ich Funktionszeiger in Go auf Gleichheit vergleichen?

Patricia Arquette
Freigeben: 2024-12-28 13:40:12
Original
984 Leute haben es durchsucht

How Can I Compare Function Pointers for Equality in Go?

Funktionszeigergleichheit in Go

In Go ist der Vergleich zweier Nicht-Null-Funktionszeiger auf Gleichheit mithilfe des Standardzeigergleichheitsoperators == in neueren Versionen ungültig geworden. Dies ist eine Abkehr vom Verhalten vor Go1, bei dem Funktionszeiger auf Identität verglichen werden konnten.

Begründung für das Nichtzulassen der Zeigergleichheit von Funktionen

Das Verbot des Vergleichs von Funktionszeigern auf Gleichheit wurde motiviert durch Die folgenden Gründe:

  • Leistung: Funktionen können als Abschlüsse implementiert werden, was jedoch nicht der Fall ist Erfassen Sie Variablen aus ihrer Umgebung. Das Zulassen von Identitätsvergleichen würde erfordern, dass die Laufzeit für jede Funktion einen neuen Abschluss erstellt, was zu einem Leistungsaufwand führt.
  • Klarheit: Um eine Vermischung von Gleichheit und Identität zu vermeiden, werden die Go1-Operatoren == und != verwendet Vergleichen Sie Werte nur auf Äquivalenz, nicht auf Identität. Dies gewährleistet einen konsistenten Ansatz in der gesamten Sprache.

Zeigergleichheit von Funktionen erreichen

Während ein direkter Zeigervergleich von Funktionen nicht mehr zulässig ist, gibt es alternative Ansätze, um das gewünschte Verhalten zu erreichen:

  • Eindeutige Variablen zuweisen: Deklarieren Sie für jede Funktion separate Variablen und vergleichen Sie diese Adressen:
package main

import "fmt"

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

var F1_ID = F1  // Create a *unique* variable for F1
var F2_ID = F2  // Create a *unique* variable for F2

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

    fmt.Println(f1 == f1)  // Prints true
    fmt.Println(f1 == f2)  // Prints false
}
Nach dem Login kopieren
  • Reflection verwenden: Das Reflect-Paket bietet Zugriff auf Objektinformationen auf niedriger Ebene, einschließlich Funktionszeigern. Sie können es verwenden, um Funktionsidentitäten zu vergleichen:
package main

import "fmt"
import "reflect"

func SomeFun() {}
func AnotherFun() {}

func main() {
    sf1 := reflect.ValueOf(SomeFun)
    sf2 := reflect.ValueOf(SomeFun)
    fmt.Println(sf1.Pointer() == sf2.Pointer())  // Prints true

    af1 := reflect.ValueOf(AnotherFun)
    fmt.Println(sf1.Pointer() == af1.Pointer())  // Prints false
}
Nach dem Login kopieren

Hinweis: Die Verwendung von „Reflect“ setzt undefiniertes Verhalten voraus. Es garantiert keine Konsistenz zwischen Plattformen oder Go-Versionen.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage