2 回答

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

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