Go 中,reflect.MakeFunc 函式可讓我們動態建立函式。然而,當使用方法(帶有接收器的函數)時,一個自然的問題就會出現:是否可以在運行時創建一個方法?
答案是不。這種限制源自於 Go 類型系統的運作方式。 Go 在編譯時執行類型檢查,如果類型的方法集要動態更改,則需要對涉及介面參數的每個函式呼叫進行執行時間介面實作檢查。
儘管如此,還是有解決方法。透過分叉反射包,我們可以創建一個值來表示附加到給定類型的方法。雖然這種方法不會改變類型的方法集,但它提供了一種在運行時模擬方法創建的方法。
或者,我們可以交換物件上的方法指標。與 Java 不同,Go 在具體值中不使用虛擬方法調度表。但是,透過操作 Reflect.nonEmptyInterface 值的 itab 字段,我們可以有效地重新連接該物件的方法呼叫。
以上是Go可以在運行時動態建立方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!