[Golang] 用interface{}实现泛型出现的问题

本文探讨了在Golang中使用interface{}尝试实现泛型时遇到的问题,详细描述了一个试图从切片获取子切片的函数导致的类型不匹配错误。文章解释了错误的原因——编译器将[]int视为interface{}而非预期的[]interface{}。为解决这个问题,作者提出了一种通过自定义函数将interface{}转换为[]interface{}的方法,以确保类型匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

在做一些实现的时候,碰到了一个棘手的问题,问题是这样的,向一个函数里传入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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值