2 回答

TA貢獻(xiàn)1806條經(jīng)驗 獲得超8個贊
當(dāng)對具體類型進(jìn)行類型斷言時,您只能對接口值中存儲的相同類型進(jìn)行類型斷言,而不能對其基類型進(jìn)行斷言。當(dāng)然,當(dāng)您擁有具體類型時,您可以將其轉(zhuǎn)換為其基本類型。
你說你想避免這種情況,你想避免必須引用具體類型。
為此,你需要反思。獲取reflect.Value
值的描述符,并使用該Value.Convert()
方法“直接”轉(zhuǎn)換為其基本類型,跳過“實際”類型。這將會成功,因為值可以轉(zhuǎn)換為其基本類型的值。
當(dāng)然,該Value.Convert()
方法將產(chǎn)生一個類型的值reflect.Value
(而不是[]interface{}
),但是您可以interface{}
使用 來獲取包裝該值的值Value.Interface()
。您現(xiàn)在將擁有一個interface{}
包裝 type 的具體值的[]interface{}
,您現(xiàn)在可以從中鍵入斷言 type 的值[]interface{}
。
看這個例子:
z := reflect.ValueOf(y).Convert(reflect.TypeOf([]interface{}{})).
? ? Interface().([]interface{})
fmt.Printf("%T %v", z, z)
輸出(在Go Playground上嘗試):
[]interface {} [b c]
這里有很多樣板,這幾乎不如簡單的類型斷言和轉(zhuǎn)換那么有效。盡量避免這樣做。

TA貢獻(xiàn)1795條經(jīng)驗 獲得超7個贊
您不能鍵入斷言變量y
to?[]interface{}
,因為 的實際數(shù)據(jù)類型y
是A
(即使A
是 的別名[]interface{}
)。
工作示例:
fmt.Println(y.(A))
但是您可以使用conversionA
將具有數(shù)據(jù)類型的變量轉(zhuǎn)換為。例子:[]interface{}
w := y.(A)
x := []interface{}(w)
// or?
z := []interface{}(y.(A))
- 2 回答
- 0 關(guān)注
- 165 瀏覽
添加回答
舉報