在 Go 中,介面表示類型必須實作的一組方法。當一個類型實作了介面聲明的方法時,就表示它可以參與該介面。
在介面實例中儲存特定類型的值涉及到類型嵌入的概念。介面值由兩個部分組成:嵌入類型的值和指向類型定義的指標。
考慮以下示例:
<code class="go">import "container/list" type Retry struct{} func main() { el := list.New().Front() el.Value = Retry{} p := &el.Value.(Retry) // Attempt to take the address of the embedded value }</code>
但是,您可能會遇到錯誤:
cannot take the address of el.Value.(Retry)
理解錯誤
發生此錯誤是因為Go 禁止取得介面中嵌入的值的位址。這個限制源自於 Go 管理介面值的方式。
當建立介面變數時,它會分配兩個字的記憶體。第一個字儲存嵌入值的類型訊息,第二個字包含值本身或指向該值的指針,取決於其大小。
為介面變數指派新值可能會重複使用儲存指派給先前的值。這種機制確保了高效的記憶體管理,但在嘗試獲取嵌入值的位址時提出了挑戰。如果儲存體重新用於新值,則指向先前值的指標將變得無效。
後果和替代方案
此限制具有重大影響:
如果您需要存取嵌入值的位址,請考慮以下替代方案:
以上是為什麼我無法取得 Go 介面中嵌入的值的位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!