無法弄清楚如何將從函數返回的接口{}轉換為結構數組作為一些實踐的一部分,我試圖創建一個函數,它可以采用某種類型的 2 個切片并將兩者連接起來并返回切片。代碼可以在這里找到 - https://play.golang.org/p/P9pfrf_qTS1type mystruct struct { name string value string}func appendarr(array1 interface{}, array2 interface{}) interface{} { p := reflect.ValueOf(array1) q := reflect.ValueOf(array2) r := reflect.AppendSlice(p, q) return reflect.ValueOf(r).Interface()}func main() { fmt.Println("=======") array1 := []mystruct{ mystruct{"a1n1", "a1v1"}, mystruct{"a1n2", "a1v2"}, } array2 := []mystruct{ mystruct{"a2n1", "a2v1"}, mystruct{"a2n2", "a2v2"}, } arrayOp := appendarr(array1, array2) fmt.Printf("arr: %#v\n", arrayOp) // this shows all the elements from array1 and 2 val := reflect.ValueOf(arrayOp) fmt.Println(val) // output is <[]main.mystruct Value> fmt.Println(val.Interface().([]mystruct)) // exception - interface {} is reflect.Value, not []main.mystruct}我可能有不同類型結構的切片。我想連接它們并單獨訪問元素。如果有任何其他方法可以實現相同的目的,請告訴我。
1 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
reflect.Append()
返回類型為 的值reflect.Value
,因此您不必(不應該)將其傳遞給reflect.ValueOf()
。
所以只需將return
語句更改為:
return?r.Interface()
這樣它就可以工作并輸出(在Go Playground上嘗試一下):
======= arr:?[]main.mystruct{main.mystruct{name:"a1n1",?value:"a1v1"},?main.mystruct{name:"a1n2",?value:"a1v2"},?main.mystruct{name:"a2n1",?value:"a2v1"},?main.mystruct{name:"a2n2",?value:"a2v2"}} [{a1n1?a1v1}?{a1n2?a1v2}?{a2n1?a2v1}?{a2n2?a2v2}] [{a1n1?a1v1}?{a1n2?a1v2}?{a2n1?a2v1}?{a2n2?a2v2}]
您也不需要對結果做任何反射功夫:它是您的切片包裹在interface{}
.?將其包裝起來reflect.Value
并調用Value.Interface()
它只是一個多余的循環。您可以簡單地執行以下操作:
arrayOp.([]mystruct)
附帶說明:您不應該創建在append()
底層使用反射的“通用”函數,因為此功能可作為內置函數使用append()
。內置函數是通用的,它從編譯器獲得幫助,因此它在編譯時提供通用性質。無論你使用反射想出什么,都會變慢。
- 1 回答
- 0 關注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消