func ArrayColumn[T, V any](array []T, k any) any {
values := make([]V, len(array))
switch reflect.TypeOf(array).Elem().Kind() {
case reflect.Slice, reflect.Array:
for i, v := range array {
values[i] = reflect.ValueOf(v).Index(int(reflect.ValueOf(k).Int())).Interface().(V)
}
break
case reflect.Map:
for i, v := range array {
values[i] = reflect.ValueOf(v).MapIndex(reflect.ValueOf(k)).Interface().(V)
}
break
case reflect.Struct:
for i, v := range array {
values[i] = reflect.ValueOf(v).FieldByName(reflect.ValueOf(k).String()).Interface().(V)
}
break
}
return values
}
// 切片结构体调用方式
// [struct_name, string] 类型分别对应 [结构体名字, 获取的值的类型]
// 参数列表: list => 数据 "Name" => 要获取的字段的名字
resultArr := ArrayColomn[struct_name, string](list, "Name")
resultArr.([]string) // 获取到的数据表可以直接断言成泛型列表传入的值类型使用
// 二维数组调用方式
// [[]int, string] 类型分别对应 [第二维数组的类型, 获取的值的类型]
resultArr := arrays.ArrayColumn[[]int, int](list, 0)
resultArr.([]int) // 获取到的数据表可以直接断言成泛型列表传入的值类型使用
// 切片Map调用方式
// [map[string]interface{}, int] 类型分别对应 [数组下map的具体类型, 获取的值的类型]
resultArr := arrays.ArrayColumn[map[string]interface{}, int](list, "id"))
resultArr.([]int) // 获取到的数据表可以直接断言成泛型列表传入的值类型使用
Golang1.18使用泛型实现 array_column / ArrayColumn
于 2022-07-28 15:51:38 首次发布