3 回答

TA貢獻1850條經驗 獲得超11個贊
要理解為什么這是不可能的,考慮一下接口變量實際上是什么是有幫助的。一個接口值占用兩個詞,第一個描述所包含值的類型,第二個或者 (a) 保存所包含的值(如果它適合這個詞)或 (b) 一個指向存儲值的指針(如果該值不適合一個單詞)。
需要注意的重要事項是 (1) 包含的值屬于接口變量,以及 (2) 在為變量分配新值時,該值的存儲可能會被重用。知道了這一點,請考慮以下代碼:
var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}
現(xiàn)在整數(shù)的存儲已被重新用于保存指針,*p現(xiàn)在是該指針的整數(shù)表示。你可以看到它是如何有能力打破類型系統(tǒng)的,所以 Go 沒有提供一種方法來做到這一點(除了使用unsafe包之外)。
如果您需要一個指向存儲在列表中的結構的指針,那么一種選擇是將指向列表中的結構的指針而不是直接存儲結構值。或者,您可以將*list.Element值作為對所包含結構的引用傳遞。

TA貢獻1828條經驗 獲得超13個贊
在第一個近似值中:你不能那樣做。即使你可以,p
它本身也必須有類型interface{}
并且不會有太大幫助 - 你不能直接取消引用它。
強制性問題是:你想解決什么問題?
最后但并非最不重要的一點:接口定義行為而不是結構。直接使用接口的底層實現(xiàn)類型通常會破壞接口契約,盡管可能存在非一般的合法情況。但是,對于一組有限的靜態(tài)已知類型,類型 switch 語句已經提供了這些。

TA貢獻1887條經驗 獲得超5個贊
獲取指向接口值的指針?
給定接口類型的變量,有沒有辦法獲取指向存儲在變量中的值的指針?
這不可能。
羅伯·派克
接口值不一定是可尋址的。例如,
package main
import "fmt"
func main() {
var i interface{}
i = 42
// cannot take the address of i.(int)
j := &i.(int)
fmt.Println(i, j)
}
地址運算符
對于 T 類型的操作數(shù) x,地址操作 &x 生成一個類型為 *T 的指針,指向 x。操作數(shù)必須是可尋址的,即變量、指針間接或切片索引操作;或可尋址結構操作數(shù)的字段選擇器;或可尋址數(shù)組的數(shù)組索引操作。作為可尋址性要求的一個例外,x 也可以是復合文字。
- 3 回答
- 0 關注
- 215 瀏覽
添加回答
舉報