[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)

猜你喜欢

转载自blog.csdn.net/bobodem/article/details/80201059