go collection
coding
基于接口实现map泛型遍历
map 的key必须是可以进行比较的,如果之后需要扩展可以进行组合
type OrderedType interface {
Integer | Float | ~string
}
type Integer interface {
Signed | Unsigned
}
type Signed interface {
~int | ~int8 | ~int16 | ~int32 | ~int64
}
type Unsigned interface {
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
type Float interface {
~float32 | ~float64
}
func Map2Splice[T any, K OrderedType](mapData map[K]T) []T {
listData := make([]T, len(mapData))
for _, t := range mapData {
listData = append(listData, t)
}
return listData
}
一些方便的集合转换操作
func InArray[vT any](need vT, haystack []vT) bool {
for _, v := range haystack {
if cast.ToString(need) == cast.ToString(v) {
return true
}
}
return false
}
func ArrayMap[T, T2 any](f func(T) T2, list []T) (result []T2) {
for _, item := range list {
result = append(result, f(item))
}
return
}
func ArrayFilter[T any](f func(T) bool, list []T) (result []T) {
for _, item := range list {
if f(item) {
result = append(result, item)
}
}
return
}
func ArrayKeyExists(key any, arr map[any]any) bool {
if len(arr) == 0 {
return false
}
for k := range arr {
if key == k {
return true
}
}
return false
}
func Map2Slice[K comparable, V any](m map[K]V) []V {
s := make([]V, len(m))
i := 0
for _, v := range m {
s[i] = v
i += 1
}
return s
}
func Slice2Map[V any, K comparable](s []V, f func(V) K) map[K]V {
m := make(map[K]V, len(s))
for _, v := range s {
m[f(v)] = v
}
return m
}
func Map2Map[mK comparable, mV any, newK comparable, newV any](oldMap map[mK]mV, f func(mK, mV) (newK, newV)) map[newK]newV {
newMap := make(map[newK]newV, len(oldMap))
for k, v := range oldMap {
nk, nv := f(k, v)
newMap[nk] = nv
}
return newMap
}
评论列表