前言
Go本身slice的方法是较少的,其他语言中的过滤和转换相关的经常使用的方法也没有,我们可以扩展一下方便使用。
切片slice
过滤
方法
通过一个函数参数来过滤所需的元素,只有满足条件元素才返回到结果集中:
1 | func SliceFilter[T any](s []T, fn func(T) bool) []T { |
判空也是常用的功能,获取所有非空集:
1 | func SliceFilterNonNil[T any](s []*T) []*T { |
调用
1 | package test |
转换
方法
通过一个转换函数,可方便地把原切片转换为新的切片:
1 | func SliceTrans[S, R any](s []S, fn func(S) R) []R { |
若只需要转换满足条件的元素,可先过滤再转换:
1 | func SliceTransWithFilter[S, R any](s []S, fn func(S) (R, bool)) []R { |
调用
1 | package test |
累计
对切片中的元素累计,获取一个最终结果:
1 | func SliceAccum[S, R any](init R, s []S, fn func(last R, ele S) R) R { |
字典 map
创建Map
1 | var schoolUserMap = map[string]string{} |
过滤
方法
1 | func MapFilter[K comparable, V any](m map[K]V, fn func(key K, value V) bool) map[K]V { |
调用
1 | package test |
结果
1 | map[name:xiaohong] |
转换
方法
1 | func MapTrans[K comparable, V, R any](m map[K]V, fn func(key K, value V) (R, bool)) map[K]R { |
调用
1 | package test |
结果
1 | map[age:18岁 name:XIAOHONG] |
其中返回值中的bool,代表对应的key是否保留。