Go では、標準のポインター等価演算子 == を使用して 2 つの非 nil 関数ポインターの等価性を比較することは、最近のバージョンでは無効になりました。これは、関数ポインターの同一性を比較することができた Go1 より前の動作からの逸脱です。
関数ポインターの等価性の比較を禁止する動機は次のとおりです。次の理由:
関数の直接のポインター比較は許可されなくなりましたが、望ましい動作を達成するための代替アプローチがあります。
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 fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
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()) // Prints true af1 := reflect.ValueOf(AnotherFun) fmt.Println(sf1.Pointer() == af1.Pointer()) // Prints false }
注: リフレクトの使用は未定義の動作に依存します。プラットフォーム間または Go バージョン間での一貫性は保証されません。
以上がGo で関数ポインターを比較して等しいかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。