首頁  >  文章  >  後端開發  >  如何比較 Go 中的函數?

如何比較 Go 中的函數?

Linda Hamilton
Linda Hamilton原創
2024-11-01 06:25:30134瀏覽

How Can You Compare Functions in Go?

比較 Go 中的函數

在 Go 中,函數是一等值,這意味著它們可以分配給變數並作為參數傳遞給其他函數。然而,與 Go 中的其他類型不同,函數預設是不可比較的。當嘗試比較程式碼中的函數時,這可能會導致混亂。

比較問題

正如 Go 語言規範中詳細說明的,函數值是不可比較的。嘗試使用標準比較運算子(例如 == 或 !=)比較函數值將導致編譯器錯誤。

<code class="go">if handler.Post != Undefined {
  // ...
}</code>

未定義的未定義函數

程式碼範例中存在的未定義函數是一個函數的範例,其定義方式與常規函數不同。它被宣告為一個函數,它接受單一字串參數並且不傳回任何內容(func Undefined(foo string))。然後將 Undefined 指派給 init 函數中 Handler 結構體的 Get 欄位。此賦值為 Undefined 建立函數值,該值儲存在 Get 欄位中。

比較函數值位址

雖然函數本身無法比較,但可以比較函數值的位址。這可以透過使用 fmt.Sprintf 函數來取得函數位址的字串表示形式,然後比較結果字串來實現。

<code class="go">p1 := fmt.Sprintf("%v", Undefined)
p2 := fmt.Sprintf("%v", hand.Get)
 fmt.Println("Expecting true:", p1 == p2)</code>

此方法有效地將函數值轉換為字串,然後可以將其使用==運算子進行比較。

替代方法:reflect.Value.Pointer()

比較函數值位址的另一種方法是使用reflect.Value.Pointer()方法。此方法會傳回反射值的記憶體位址,然後可以將其與另一個函數值的位址進行比較。

<code class="go">u1 := reflect.ValueOf(Undefined).Pointer()
u2 := reflect.ValueOf(hand.Get).Pointer()
fmt.Println("Expecting true:", u1 == u2)</code>

為了清晰而重構

一般不建議比較函數值位址。相反,重構程式碼以消除此類比較的需求是一種更有效且可維護的方法。考慮使用不同的方法,例如定義介面或使用類型斷言,來實現您想要的行為。

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

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