」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 在 Go 中如何可靠地比較函數指標是否相等?

在 Go 中如何可靠地比較函數指標是否相等?

發佈於2024-12-22
瀏覽:391

How Can I Reliably Compare Function Pointers for Equality in Go?

檢測Go 中函數的指標相等性每週

傳統上,比較Go 中的兩個非零函數指標涉及使用== 或!=運算符。然而,根據最近的變化,這種方法現在會導致錯誤。

更改背後的基本原則

函數指標相等比較的消除源自於相等與同一的概念。在 Go 中,== 和 != 運算子評估值的等價性,而不是同一性。這種區別旨在防止這些概念之間發生混淆。

效能注意事項

此外,函數的比較也會影響效能。例如,不引用外部變數的匿名閉包應該由編譯器最佳化為單一實作。比較函數指標會阻礙這種最佳化,需要在執行時動態建立新的閉包。

利用 Reflect 套件

雖然可以使用 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