Скука и рутина это зло

run{}

Сравнение функций в Go

Мне всегда казалось естественным сравнивать функции в языках с поддержкой ФВП. Понятное дело, что сравнить ведут ли себя функции одинаково, в одинаковый код ли они скомпилировались дело сложное и, в действительности, не нужное. Но почему бы не сравнивать их указатели? Возвращать true когда это гарантированно так.

Некоторое время назад, разбираясь с Haskell я поднимал тему на ЛОРе.

Сейчас пишу небольшой проект на Go и наткнулся на ту же проблему. Даже задал вопрос в списке рассылки, и в ходе обсуждения выяснилось что это может связать руки компилятору в создании некоторых оптимизаций. (Например если компилятор захочет сделать inline).

Так что этого стоит избегать.

Пока я выяснял степень православности сравнения указателей функций, я накалякал вот такой костылик:

package main

import "reflect"
import "fmt"

func f() {}
func g() {}

func equals(f, g interface{}) bool {
    fPtr := reflect.ValueOf(f).Pointer()
    gPtr := reflect.ValueOf(g).Pointer()
    return fPtr == gPtr
}

func main() {
    if equals(f, g) {
        fmt.Println("f and g are equal!")
    } else {
        fmt.Println("f and g are not equal.")
    }
}

Ответ разумеется "f and g are not equal.".

Comments