Традиционно сравнение двух ненулевых указателей функций в Go включало использование операторов == или !=. Однако после недавних изменений этот подход теперь приводит к ошибкам.
Отказ от сравнения указателей на равенство для функций вытекает из концепции равенства и идентичности. В Go операторы == и != оценивают эквивалентность значений, а не идентичность. Это различие призвано предотвратить путаницу между этими понятиями.
Кроме того, сравнение функций влияет на производительность. Например, анонимные замыкания, не ссылающиеся на внешние переменные, должны быть оптимизированы компилятором в единую реализацию. Сравнение указателей функций будет препятствовать этой оптимизации, требуя динамического создания новых замыканий во время выполнения.
Хотя можно определить идентичность функции с помощью пакета отражения, важно отметить, что этот подход влечет за собой неопределенное поведение. Результаты таких сравнений ненадежны, поскольку компилятор может решить объединить несколько функций в одну реализацию.
Для эффективного сравнения указателей функций можно использовать следующий подход:
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