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

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

Patricia Arquette
發布: 2024-12-28 13:40:12
原創
948 人瀏覽過

How Can I Compare Function Pointers for Equality in Go?

Go 中的函數指標相等

在Go 中,使用標準指標相等運算子== 比較兩個非零函數指標的相等性在最新版本中已變得無效。這與 Go1 之前的行為不同,在 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
}
登入後複製
  • 使用反射:reflect套件提供對物件資訊的低階訪問,包括函數指標。您可以使用它來比較函數身分:
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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板