Обратите внимание, что существует разница между равенством и идентичностью.Операторы ==
и !=
в Go1 сравнивают значения для эквивалентности (кроме случаев сравнения каналов), а не для идентичности.Поскольку эти операторы пытаются , а не смешивать равенство и идентичность, Go1 в этом отношении более согласован, чем pre-Go1.
Равенство функций отличается от идентичности функций.
Одной из причин запрета ==
и !=
для типов функций является производительность.Например, следующее замыкание не использует никаких переменных из своей среды:
f := func(){fmt.Println("foo")}
Запрещение сравнения функций позволяет компилятору генерировать единственную реализацию для замыкания, вместо того чтобы требовать времени выполнения для созданияновое закрытие (во время выполнения).Таким образом, с точки зрения производительности решение о запрете сравнения функций было хорошим решением.
В отношении использования пакета reflect
для определения идентификатора функции, код типа
func SomeFun() {}
func AnotherFun() {}
func main() {
sf1 := reflect.ValueOf(SomeFun)
sf2 := reflect.ValueOf(SomeFun)
fmt.Println(sf1.Pointer() == sf2.Pointer()) // Prints true
af1 := reflect.ValueOf(AnotherFun)
fmt.Println(sf1.Pointer() == af1.Pointer()) // Prints false
}
полагается на неопределенное поведение .Нет никаких гарантий относительно того, что программа будет печатать.Компилятор может решить, что он объединит SomeFun
и AnotherFun
в одну реализацию, и в этом случае 2-й оператор print выведет true
.На самом деле, нет абсолютно никакой гарантии, что 1-й оператор печати будет печатать true
(он может, при некоторых других компиляторах Go1 и во время выполнения, печатать false
).
Правильный ответна ваш оригинальный вопрос:
package main
import "fmt"
func F1() {}
func F2() {}
var F1_ID = F1 // Create a *unique* variable for F1
var F2_ID = F2 // Create a *unique* variable for 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
}