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中文網其他相關文章!