傳統上,比較Go 中的兩個非nil 函數指標涉及使用== 或!=運算符。然而,根據最近的變化,這種方法現在會導致錯誤。
函數指標相等比較的消除源自於相等與同一的概念。在 Go 中,== 和 != 運算子評估值的等價性,而不是同一性。這種區別旨在防止這些概念之間的混淆。
此外,函數的比較也會影響效能。例如,不引用外部變數的匿名閉包應該由編譯器最佳化為單一實作。比較函數指標會阻礙這種最佳化,需要在執行時動態建立新的閉包。
雖然可以使用 Reflect 套件來確定函數標識,但需要注意的是這種方法會帶來未定義的行為。這種比較的結果是不可靠的,因為編譯器可能決定將多個函數折疊成一個實作。
為了有效地比較函數指針,可以採用以下方法:
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Assign a unique variable to F1 var F2_ID = F2 // Assign a unique variable to 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 }
透過使用指向與每個函數關聯的唯一變數的指針,您可以有效地偵測函數之間的指標相等性。
以上是在 Go 中如何可靠地比較函數指標是否相等?的詳細內容。更多資訊請關注PHP中文網其他相關文章!