说明
在做一些实现的时候,碰到了一个棘手的问题,问题是这样的,向一个函数里传入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)
本文探讨了在Golang中使用interface{}尝试实现泛型时遇到的问题,详细描述了一个试图从切片获取子切片的函数导致的类型不匹配错误。文章解释了错误的原因——编译器将[]int视为interface{}而非预期的[]interface{}。为解决这个问题,作者提出了一种通过自定义函数将interface{}转换为[]interface{}的方法,以确保类型匹配。
2097

被折叠的 条评论
为什么被折叠?



