In Go, c'è un modo per confrontare due puntatori di funzione non nulli per testare l'uguaglianza? Il mio standard di uguaglianza è l'uguaglianza dei puntatori. In caso contrario, esiste una ragione particolare per cui l'uguaglianza tra puntatori non è consentita?Come si confrontano due funzioni per l'uguaglianza del puntatore nell'ultimo Go settimanale?
A partire da ora, se tento di farlo nel modo straight-forward:
package main
import "fmt"
func SomeFun() {
}
func main() {
fmt.Println(SomeFun == SomeFun)
}
ottengo
./func-pointers.go:12: invalid operation: SomeFun == SomeFun (func can only be compared to nil)
È la mia comprensione che questo comportamento è stato introdotto di recente.
Ho trovato una risposta utilizzando il pacchetto reflect; tuttavia Atom suggerisce di seguito che questo produce un comportamento indefinito. Vedi il post di Atom per maggiori informazioni e una possibile soluzione alternativa.
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())
af1 := reflect.ValueOf(AnotherFun)
fmt.Println(sf1.Pointer() == af1.Pointer())
}
Uscite:
true
false
Ottima risposta. Grazie! Ottieni sicuramente credito per aver risposto "perché", ma sono confuso riguardo alla tua risposta alla mia domanda iniziale. Sembra che stia testando l'identità delle variabili F1_ID e F2_ID piuttosto che l'identità delle funzioni F1 e F2. Ad esempio, se avessi "var F1_ID2 = F1", allora & F1_ID == e F1_ID2 restituirebbero true se stessimo testando l'identità della funzione; ma restituisce falso. – BurntSushi5
Inoltre, la tua critica del mio approccio all'utilizzo riflette mi preoccupa. Non stai suggerendo che l'identità della funzione di test è impossibile da garantire in Go? – BurntSushi5
Commento1: l'ipotesi nell'ultimo snippet di codice è che una particolare funzione abbia un singolo ID. –