En Go, ¿hay alguna forma de comparar dos punteros de función que no sean nulos para probar la igualdad? Mi estándar de igualdad es la igualdad del puntero. Si no, ¿hay alguna razón particular por la cual la igualdad del puntero no está permitida?¿Cómo comparo dos funciones para la igualdad del puntero en la última versión de Go weekly?
A partir de ahora, si intento hacer esto de la manera recta hacia adelante:
package main
import "fmt"
func SomeFun() {
}
func main() {
fmt.Println(SomeFun == SomeFun)
}
me sale
./func-pointers.go:12: invalid operation: SomeFun == SomeFun (func can only be compared to nil)
Es mi entendimiento de que este comportamiento se introdujo recientemente.
He encontrado una respuesta utilizando el paquete de reflejar; sin embargo, Atom sugiere a continuación que esto realmente produce un comportamiento indefinido. Consulte la publicación de Atom para obtener más información y una posible solución 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())
}
Salidas:
true
false
Excelente respuesta. ¡Gracias! Definitivamente tienes crédito por responder "por qué", pero estoy confundido acerca de tu respuesta a mi pregunta original. Parece que está probando la identidad de las variables F1_ID y F2_ID en lugar de la identidad de las funciones F1 y F2. Por ejemplo, si tuviera 'var F1_ID2 = F1', entonces & F1_ID == & F1_ID2 devolvería verdadero si estuviéramos probando la identidad de la función; pero devuelve falso. – BurntSushi5
Además, su crítica a mi enfoque de uso de reflect me preocupa. ¿No está sugiriendo que probar la identidad de la función es imposible de garantizar en Go? – BurntSushi5
Comentario1: La suposición en el último fragmento de código es que una función en particular tiene una única ID. –