在 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()方法。此方法會傳回反射值的記憶體位址,然後可以將其與另一個函數值的位址進行比較。
<code class="go">u1 := reflect.ValueOf(Undefined).Pointer() u2 := reflect.ValueOf(hand.Get).Pointer() fmt.Println("Expecting true:", u1 == u2)</code>
一般不建議比較函數值位址。相反,重構程式碼以消除此類比較的需求是一種更有效且可維護的方法。考慮使用不同的方法,例如定義介面或使用類型斷言,來實現您想要的行為。
以上是如何比較 Go 中的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!