首頁 >後端開發 >Golang >在 Go 中如何可靠地比較函數指標是否相等?

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

Linda Hamilton
Linda Hamilton原創
2024-12-18 09:35:11238瀏覽

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

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

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

改變背後的基本原理

函數指標相等比較的消除源自於相等與同一的概念。在 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
}

透過使用指向與每個函數關聯的唯一變數的指針,您可以有效地偵測函數之間的指標相等性。

以上是在 Go 中如何可靠地比較函數指標是否相等?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn