我有以下几点:

type Int32A int32
type Int32B int32

并希望实现一个函数,可以接受类型为reflect.Int32的任何类型的切片,并将其转换为[]int32.例如:

func ConvertTypeSliceToInt32Slice(es «es-type») []int32 {
  result := make([]int32, len(es))
  for i := 0; i < len(result); i++ {
    result[i] = es[i].(int32)
  }

  return result
}

func caller() {
  Int32as := Int32A{1, 2}
  Int32bs := Int32B{3, 5}

  int32as := ConvertTypeSliceToInt32Slice(Int32as)
  int32bs := ConvertTypeSliceToInt32Slice(Int32bs)
}

对于任何类型为reflect.Int32的任意类型定义,如何做到这一点?(上下文:此函数将用于转换proto enum的切片;即完整的类型集未知且无边界,因此对每种类型执行switch是不可行的).

此外,我使用1.17,所以我不能使用参数化类型(又名模板).

一次失败的try (它在is.([]interface{})时panic ):

func ConvertTypeSliceToInt32Slice(is interface{}) []int32 {
    es := is.([]interface{})
    result := make([]int32, len(es))
    for i := 0; i < len(result); i++ {
        result[i] = es[i].(int32)
    }

    return result
}

推荐答案

int32在本例中是"基础类型",~type parameter declaration中是如何指定基础类型的约束.

例如:https://go.dev/play/p/8-WAu9KlXl5

func ConvertTypeSliceToInt32Slice[T ~int32](es []T) []int32 {
    result := make([]int32, len(es))
    for i := 0; i < len(result); i++ {
        result[i] = int32(es[i])
    }

    return result
}

如果需要使用反射,可以在附加到最终切片之前转换每个元素的类型:

func ConvertTypeSliceToInt32Slice(es interface{}) []int32 {
    v := reflect.ValueOf(es)
    int32ty := reflect.TypeOf(int32(0))

    result := make([]int32, v.Len())
    for i := 0; i < v.Len(); i++ {
        result[i] = v.Index(i).Convert(int32ty).Interface().(int32)
    }
    return result
}

如果需要确保未转换其他可转换的数字类型,可以根据需要比较元素类型和panic或error:

if v.Type().Elem().Kind() != reflect.Int32 {
...

Go相关问答推荐

Kafka消费者在需要时不会暂停

ChromeDriver不存在(高朗selenium)

通过渠道和goroutines增值1000倍

通过代理从golang连接到ftp

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

从文件读取字节,将其保存到 struct 体并修改值

如何在 zap 记录器库中使用自定义时间函数

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

Kubo,来自 IpfsNode.Bootstrap 的无效内存地址或零指针取消引用

Go 切片容量增长率

Golang 构建多平台问题

在 Gorm 的 AfterFind() 钩子中获取智能 Select struct 的值

为什么在单独的 go routine 中需要 wg.Wait() 和 close() ?

Golang并发写入多个文件

如何使用 math/big 对 bigInt 进行取模?

Go 导入范围查找 protobuf 类型

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

在 Go 中,为什么 exec.Command() 失败但 os.StartProcess() 成功启动winget.exe?

为什么 template.ParseFiles() 没有检测到这个错误?