2 回答

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

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