«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу надежно сравнивать указатели функций на предмет равенства в Go?

Как я могу надежно сравнивать указатели функций на предмет равенства в Go?

Опубликовано 22 декабря 2024 г.
Просматривать:628

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

Обнаружение равенства указателей для функций в Go еженедельно

Традиционно сравнение двух ненулевых указателей функций в Go включало использование операторов == или !=. Однако после недавних изменений этот подход теперь приводит к ошибкам.

Обоснование изменения

Отказ от сравнения указателей на равенство для функций вытекает из концепции равенства и идентичности. В Go операторы == и != оценивают эквивалентность значений, а не идентичность. Это различие призвано предотвратить путаницу между этими понятиями.

Аспекты производительности

Кроме того, сравнение функций влияет на производительность. Например, анонимные замыкания, не ссылающиеся на внешние переменные, должны быть оптимизированы компилятором в единую реализацию. Сравнение указателей функций будет препятствовать этой оптимизации, требуя динамического создания новых замыканий во время выполнения.

Использование пакета Reflect

Хотя можно определить идентичность функции с помощью пакета отражения, важно отметить, что этот подход влечет за собой неопределенное поведение. Результаты таких сравнений ненадежны, поскольку компилятор может решить объединить несколько функций в одну реализацию.

Верное решение

Для эффективного сравнения указателей функций можно использовать следующий подход:

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
}

Используя указатели на уникальные переменные, связанные с каждой функцией, вы можете эффективно обнаружить равенство указателей между функциями.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3