Go语言任意类型数组分割方法 - 使用reflect包
在 Go 中,可以使用 reflect 包中的 Value 类型和相关方法来实现任意类型数组的分割。
以下是一个示例代码,其中使用 reflect.ValueOf() 方法获取传入的数组的 reflect.Value 类型,然后使用 reflect.SliceOf() 方法获取数组元素类型的 reflect.Type 类型,并使用 reflect.MakeSlice() 方法创建新的切片。
package main
import (
"fmt"
"reflect"
)
func splitArray(arr interface{}, chunkSize int) [][]interface{} {
v := reflect.ValueOf(arr)
if v.Kind() != reflect.Slice {
panic("splitArray: arr is not a slice")
}
elemType := v.Type().Elem()
sliceType := reflect.SliceOf(elemType)
chunks := make([][]interface{}, 0)
for i := 0; i < v.Len(); i += chunkSize {
j := i + chunkSize
if j > v.Len() {
j = v.Len()
}
chunkValue := reflect.MakeSlice(sliceType, j-i, j-i)
for k := i; k < j; k++ {
chunkValue.Index(k - i).Set(v.Index(k))
}
chunks = append(chunks, chunkValue.Interface().([]interface{})
}
return chunks
}
func main() {
intArr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
chunks := splitArray(intArr, 3)
fmt.Println(chunks)
strArr := []string{'a', 'b', 'c', 'd', 'e', 'f', 'g'}
chunks = splitArray(strArr, 2)
fmt.Println(chunks)
}
输出结果为:
[[1 2 3] [4 5 6] [7 8 9]]
[['a' 'b'] ['c' 'd'] ['e' 'f'] ['g']]
该示例代码可以接受任意类型的数组作为输入,并将其分割成指定大小的切片。注意,为了将 reflect.Value 类型转换为切片类型,需要使用 reflect.Value.Interface() 方法获取原始值,并使用类型断言将其转换为切片类型。
原文地址: https://www.cveoy.top/t/topic/lNwp 著作权归作者所有。请勿转载和采集!