2 回答
TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)對(duì)具體類型進(jìn)行類型斷言時(shí),您只能對(duì)接口值中存儲(chǔ)的相同類型進(jìn)行類型斷言,而不能對(duì)其基類型進(jìn)行斷言。當(dāng)然,當(dāng)您擁有具體類型時(shí),您可以將其轉(zhuǎn)換為其基本類型。
你說(shuō)你想避免這種情況,你想避免必須引用具體類型。
為此,你需要反思。獲取reflect.Value值的描述符,并使用該Value.Convert()方法“直接”轉(zhuǎn)換為其基本類型,跳過(guò)“實(shí)際”類型。這將會(huì)成功,因?yàn)橹悼梢赞D(zhuǎn)換為其基本類型的值。
當(dāng)然,該Value.Convert()方法將產(chǎn)生一個(gè)類型的值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)單的類型斷言和轉(zhuǎn)換那么有效。盡量避免這樣做。
TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
您不能鍵入斷言變量yto?[]interface{},因?yàn)?的實(shí)際數(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)注
- 187 瀏覽
添加回答
舉報(bào)
