在Go 中,使用標準指標相等運算子== 比較兩個非零函數指標的相等性在最新版本中已變得無效。這與 Go1 之前的行為不同,在 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中文網其他相關文章!