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

Есть ли в 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
26
задан BurntSushi5 22 August 2016 в 05:26
поделиться