首頁 > 後端開發 > Golang > 為什麼 Golang 介面中的不可尋址值無法透過位址存取?

為什麼 Golang 介面中的不可尋址值無法透過位址存取?

Susan Sarandon
發布: 2024-11-28 06:25:17
原創
456 人瀏覽過

Why Are Non-Addressable Values in Golang Interfaces Not Accessable by Address?

Golang 介面中的不可尋址值

Go 介面中不可尋址值的概念在Golang 文件和社群論壇中廣泛討論,提出了一個問題:為什麼不能透過地址存取這些值?

背景

As MethodSets 上的Go wiki (https://github.com/golang/go/wiki/MethodSets#interfaces) 指出,「儲存在介面中的具體值是不可尋址的,就像映射元素不可尋址一樣。

介面值不可尋址的原因

但是,介面中值不可尋址的根本原因尚不清楚。為什麼語言設計要強加這個限制?

答案在於保持類型完整性。指向特定類型值的指標在指派給介面時應指向該類型的值。但是,如果介面可以包含不同類型的值,則每當將不同類型的值指派給介面時,指標就會變得無效。

為了說明這一點,請考慮一個介面I 和兩個型別A 和B,實作I:

type I interface{}
type A int
type B string
登入後複製

如果我們在I 中儲存一個A 值並取得該值的位址,則結果指標將指向*A 類型。但是,如果我們隨後將 B 值指派給 I,則指標將變得無效。

對具有指標接收器的方法的影響

介面值的不可尋址性對具有指標的方法有直接影響接收器。此類方法需要一個指向特定特定類型的指標。由於介面中的非指標值是不可尋址的,因此無法將其傳遞給具有指標接收器的方法,從而導致錯誤:

<type> does not implement <interface> (<name> method has pointer receiver)
登入後複製

結論

綜上所述, Go 介面中值不可尋址的原因是為了保護型別完整性。指向特定類型值的指標應始終指向該類型的值,如果該值儲存在可以保存不同類型值的介面中,則無法保證這一點。

以上是為什麼 Golang 介面中的不可尋址值無法透過位址存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板