Нормальное использование функциональных переменных в Go позволяет сравнивать их только с nil, а не с другими. Причина этого (как мне объяснили) заключается в том, что, поскольку Go имеет замыкания, определение равенства является нечетким. Если у меня есть два разных закрытия с разными значениями, привязанными к локальным переменным, но которые используют одну и ту же основную функцию, должны ли они считаться равными или неравными?Сравнить значения функций в Go
Однако, я do хочу иметь возможность сделать такое сравнение. В частности, у меня есть код, как это (за исключением, в моем реальном коде, проверка на самом деле нужно - это просто пустышка пример), где я сравниваю указатель на функцию, функцию буквальное:
func getFunc(which bool) (func()) {
if which {
return func1
} else {
return func2
}
}
func func1() { }
func func2() { }
f := getFunc(true)
if f == func1 {
fmt.Println("func1")
} else {
fmt.Println("func2")
}
Есть ли любым способом, например, используя пакеты reflect или unsafe, чтобы заставить это работать?
Существует причина, по которой функции нельзя сравнивать (вы на самом деле назвали ее). Хотя это может быть возможно с отражением пакета, я не вижу никакого использования в приведенном выше примере кода: если вы выполняете 'f: = getFunc (true)' you _know_, то получаете func1. Так почему же сравнивать? – Volker
Это не тот код, который я использую; это просто пример, который поможет вам понять, какое сравнение я пытаюсь сделать (часть 'f == func1'). – joshlf
Возможный дубликат: http: // stackoverflow.com/questions/9643205/how-do-i-compare-two-functions-for-pointer-equal-in-the-top-go-weekly – BurntSushi5