golang泛型函数分割任意类型序列到多个子序列

使用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]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值