首頁 > 後端開發 > Golang > 主體

為什麼我無法取得 Go 介面中嵌入的值的位址?

Susan Sarandon
發布: 2024-10-30 12:07:03
原創
727 人瀏覽過

 Why Can't I Take the Address of a Value Embedded Within a Go Interface?

取得介面內值的位址

在 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 管理介面值的方式。

當建立介面變數時,它會分配兩個字的記憶體。第一個字儲存嵌入值的類型訊息,第二個字包含值本身或指向該值的指針,取決於其大小。

為介面變數指派新值可能會重複使用儲存指派給先前的值。這種機制確保了高效的記憶體管理,但在嘗試獲取嵌入值的位址時提出了挑戰。如果儲存體重新用於新值,則指向先前值的指標將變得無效。

後果和替代方案

此限制具有重大影響:

  • 它防止直接存取嵌入在介面中的值的位址。
  • 它確保類型安全並防止資料結構損壞。

如果您需要存取嵌入值的位址,請考慮以下替代方案:

  • 在介面中儲存指標:不要直接儲存值,而是儲存指向介面內的值的指標。
  • 傳遞 list.Element 值: 使用 list.Element 值傳遞對嵌入值的參考。

以上是為什麼我無法取得 Go 介面中嵌入的值的位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!