"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso comparar com segurança ponteiros de função para igualdade no Go?

Como posso comparar com segurança ponteiros de função para igualdade no Go?

Publicado em 2024-12-22
Navegar:549

How Can I Reliably Compare Function Pointers for Equality in Go?

Detecting Pointer Equality for Functions in Go Weekly

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 justificativa por trás da mudança

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.

Considerações sobre desempenho

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.

Utilizando o pacote Reflect

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.

Uma solução válida

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.

Tutorial mais recente Mais>

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