Go で、2 つの非 nil 関数ポインタを比較して等しいかどうかをテストする方法はありますか? 私の平等の基準はポインターの平等です。そうでない場合、ポインターの等価性が許可されない特定の理由はありますか?
今のところ、これを簡単な方法で行おうとすると:
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