首頁  >  文章  >  後端開發  >  如果標準比較運算子不起作用,如何比較 Go 中的函數?

如果標準比較運算子不起作用,如何比較 Go 中的函數?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 07:27:01377瀏覽

How can you compare functions in Go if standard comparison operators don't work?

比較 Go 中的函數

在 Go 中,使用標準比較運算子比較兩個函數值是不可行的。但是,還有其他方法可以檢查函數是否等效。

使用函數位址

函數值本身不具可比性。相反,您可以比較函數值的位址以確定它們是否引用相同的函數。要取得函數的位址,可以使用fmt 套件的Sprintf("%v") 函數:

<code class="go">hand := &Handler{Undefined, Defined}
p1 := fmt.Sprintf("%v", Undefined)
p2 := fmt.Sprintf("%v", hand.Get)

if p1 == p2 {
    // Undefined and hand.Get refer to the same function.
}</code>

使用Reflect.Value

另一種方法是使用reflect.Value型別取得底層函數指標。這正是 fmt 套件內部所做的:

<code class="go">value := reflect.ValueOf(Undefined)
ptr := value.Pointer()</code>

然後您可以比較 ptr 值以確定函數是否相等。

注意

但是,需要注意的是,比較函數位址並不是適用於所有場景的可靠方法。函數閉包和動態產生的函數即使執行相同的任務也可以有不同的位址。

因此,通常建議避免比較函數位址,而是考慮比較函數行為的替代方法,例如測試其輸入和輸出值。

以上是如果標準比較運算子不起作用,如何比較 Go 中的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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