傳統上,比較Go 中的兩個非零函數指標涉及使用== 或!=運算符。然而,根據最近的變化,這種方法現在會導致錯誤。
函數指標相等比較的消除源自於相等與同一的概念。在 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 }
透過使用指向與每個函數關聯的唯一變數的指針,您可以有效地檢測函數之間的指針相等性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3