如何将真正属于 reflect.Int32 类型切片的 interface{} 转换为 int32 切片?
How to convert interface{} that's really a slice of types whose kind is reflect.Int32 into slice of int32?
我有以下内容:
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
,所以我不能使用参数化类型(又名模板)。
一次尝试无效(它在 is.([]interface{})
处出现恐慌):
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 {
...
我有以下内容:
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
,所以我不能使用参数化类型(又名模板)。
一次尝试无效(它在 is.([]interface{})
处出现恐慌):
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 {
...