使用interface让分割函数可以接收任意类型和返回任意类型
//传入([]T, int), 返回*[][]T
func SplitSlice(input interface{}, segLength int) interface{} {
if segLength < 1 {
segLength = 1 //传入0会导致死循环
}
sliceOfElemSlice := reflect.SliceOf(reflect.TypeOf(input)) //使用输入列表的类型,再构造一个slice, 由于传入的就是一个slice,所以这里再做一次slice后就是二维的
listOfElem := reflect.New(sliceOfElemSlice) //使用New创建一个二维slice, 不能使用reflect.MakeSlice,否则会报错无法寻址
varValue := reflect.ValueOf(input)
inputLen := varValue.Len()
for start := 0; start < inputLen; {
end := start + segLength
if end >= inputLen { //结束下标超出列表长度后就直接取列表长度
end = inputLen
}
//分段取原始slice中的片段存入新的slice,注意二维列表中的数据是引用的一维列表的数据
listOfElem.Elem().Set(reflect.Append(listOfElem.Elem(), varValue.Slice(start, end)))
start = end
}
return listOfElem.Interface()
}
func main() {
fmt.Println(splitSlice([]int{1, 2, 3, 4, 5, 6,7}, 3))
}
输出内容:
&[[1 2 3] [4 5 6] [7]]