Есть ли в Go способ сравнить два ненулевых указателя на функцию для проверки на равенство? Мой стандарт равенства — равенство указателей. Если нет, то есть ли какая-то конкретная причина, по которой равенство указателей не допускается?
На данный момент, если я попытаюсь сделать это прямым способом:
package main
import "fmt"
func SomeFun() {
}
func main() {
fmt.Println(SomeFun == SomeFun)
}
я получу
./func-pointers.go:12: invalid operation: SomeFun == SomeFun (func can only be compared to nil)
Насколько я понимаю, такое поведение было введено недавно.
Я нашел ответ, используя пакет Reflect; однако Atom ниже предполагает, что это фактически приводит к неопределенному поведению. См. сообщение Atom для получения дополнительной информации и возможного альтернативного решения.
package main
import "fmt"
import "reflect"
func SomeFun() { }
func AnotherFun() { }
func main() {
sf1 := reflect.ValueOf(SomeFun)
sf2 := reflect.ValueOf(SomeFun)
fmt.Println(sf1.Pointer() == sf2.Pointer())
af1 := reflect.ValueOf(AnotherFun)
fmt.Println(sf1.Pointer() == af1.Pointer())
}
Выходы:
true
false