1. 程式人生 > >[Golang] 用interface{}實現泛型出現的問題

[Golang] 用interface{}實現泛型出現的問題

說明

在做一些實現的時候,碰到了一個棘手的問題,問題是這樣的,向一個函式裡傳入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)