Go语言 如何将'int32`类型转换为' int32 '类型?

zbsbpyhn  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(305)

我们生成了以下代码(因此无法将其更改为type Enum interface { int32 }):

type Enum int32

int32有很多这样的类型定义。
我试图创建一个泛型函数,它可以将这样的类型定义的切片转换为[]int32

func ConvertToInt32Slice[T int32](ts []T) []int32 {
    return lo.Map(ts, func(t T, _ int) int32 {
        return int32(t)
    })
}

但是下面的代码抱怨Type does not implement constraint 'interface{ int32 }' because type is not included in type set ('int32')

type Int32 int32
var int32s []Int32
i32s := ConvertToInt32Slice(int32s)

实现泛型函数需要什么,以便它可以按预期使用?

vlju58qv

vlju58qv1#

看起来您需要一个泛型函数,它可以对所有具有 * 底层类型 * int32的类型进行操作。这就是波浪号(~)标记的作用。您应该将函数的签名更改为:

func ConvertToInt32Slice[T ~int32](ts []T) []int32

另请参阅:What's the meaning of the new tilde token ~ in Go?
constraints.Integer也适用,因为它定义为:

type Integer interface {
    Signed | Unsigned
}

https://pkg.go.dev/golang.org/x/exp/constraints#Integer
其定义为:

type Signed interface {
    ~int | ~int8 | ~int16 | ~int32 | ~int64
}

type Unsigned interface {
    ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}

这样就得到了所有的类型,这些类型都是以整数类型作为基础类型的.
如果您只对以int32为基础类型的类型感兴趣,则应该使用~int32

相关问题