Tradicionalmente, comparar dos punteros de función no nulos en Go implicaba el uso de operadores == o !=. Sin embargo, después de cambios recientes, este enfoque ahora genera errores.
La eliminación de la comparación de igualdad de punteros para funciones surge del concepto de igualdad frente a identidad. En Go, los operadores == y != evalúan la equivalencia de los valores, no la identidad. Esta distinción tiene como objetivo evitar confusión entre estos conceptos.
Además, las comparaciones de funciones afectan el rendimiento. Por ejemplo, el compilador debe optimizar los cierres anónimos que no hacen referencia a variables externas en una sola implementación. La comparación de punteros de función obstaculizaría esta optimización, ya que requeriría la creación dinámica de nuevos cierres en tiempo de ejecución.
Si bien es posible determinar la identidad de la función utilizando el paquete reflect, es importante tener en cuenta que este enfoque implica un comportamiento indefinido. Los resultados de tales comparaciones no son confiables, ya que el compilador puede decidir colapsar múltiples funciones en una sola implementación.
Para comparar eficazmente los punteros de función, se puede emplear el siguiente enfoque:
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 }
Al emplear punteros a variables únicas asociadas con cada función, puede detectar eficazmente la igualdad de punteros entre funciones.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3