Tradicionalmente, comparar dois ponteiros de função não nulos em Go envolvia o uso de operadores == ou !=. No entanto, após mudanças recentes, essa abordagem agora resulta em erros.
A eliminação da comparação de igualdade de ponteiros para funções decorre do conceito de igualdade versus identidade. Em Go, os operadores == e != avaliam a equivalência de valores, não a identidade. Essa distinção visa evitar confusão entre esses conceitos.
Além disso, comparações de funções impactam o desempenho. Por exemplo, fechamentos anônimos que não se referem a variáveis externas devem ser otimizados em uma única implementação pelo compilador. Comparar ponteiros de função prejudicaria essa otimização, exigindo a criação dinâmica de novos fechamentos em tempo de execução.
Embora seja possível determinar a identidade da função usando o pacote reflect, é importante observar que esta abordagem implica um comportamento indefinido. Os resultados de tais comparações não são confiáveis, pois o compilador pode decidir recolher múltiplas funções em uma única implementação.
Para comparar efetivamente ponteiros de função, a seguinte abordagem pode ser empregada:
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 }
Ao empregar ponteiros para variáveis exclusivas associadas a cada função, você pode detectar efetivamente a igualdade de ponteiros entre funções.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3