[Golang] 用interface{}實現泛型出現的問題
阿新 • • 發佈:2019-01-26
說明
在做一些實現的時候,碰到了一個棘手的問題,問題是這樣的,向一個函式裡傳入slice和begin,end,返回slice[begin:end]。很明顯這是一個實現泛型的問題,但是在做具體實現的時候出現問題。
問題
根據問題,很容易寫下如下程式碼:
func returnSlice([]interface{}, begin, end)[]interface{}{
//...具體實現
}
slice := returnSlice([]int{1,2,3,4},1,2) // 報錯:型別不匹配
顯然上述程式碼會報型別不匹配的錯誤,究其原因,是編譯器把[]int{1,2,3,4}作為interface{}看待了,而傳入的引數型別是[]interface{},所以型別不匹配。
解決方案
需要自己構造一個將interface{}轉化為[]interface{}的函式:
//將傳入slice的每個元素拿出來interface()化
func ToSlice(arr interface{}) []interface{} {
v := reflect.ValueOf(arr)
if v.Kind() != reflect.Slice {
panic("toslice arr not slice")
}
l := v.Len()
ret := make([]interface{}, l)
for i := 0; i < l; i++ {
ret[i] = v.Index(i).Interface()
}
return ret
}
再使用的時候,就可以slice := returnSlice(ToSlice([]int{1,2,3,4}),1,2)