vRp.CD2g_test/utils/collection/merge.go

68 lines
1.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package collection
// MergeSlice 合并切片
func MergeSlice[V any](values ...V) (result []V) {
if len(values) == 0 {
return nil
}
result = make([]V, 0, len(values))
result = append(result, values...)
return
}
// MergeSlices 合并切片
func MergeSlices[S ~[]V, V any](slices ...S) (result S) {
if len(slices) == 0 {
return nil
}
var length int
for _, slice := range slices {
length += len(slice)
}
result = make(S, 0, length)
for _, slice := range slices {
result = append(result, slice...)
}
return
}
// MergeMaps 合并 map当多个 map 中存在相同的 key 时,后面的 map 中的 key 将会覆盖前面的 map 中的 key
func MergeMaps[M ~map[K]V, K comparable, V any](maps ...M) (result M) {
if len(maps) == 0 {
return make(M)
}
var length int
for _, m := range maps {
length += len(m)
}
result = make(M, length)
for _, m := range maps {
for k, v := range m {
result[k] = v
}
}
return
}
// MergeMapsWithSkip 合并 map当多个 map 中存在相同的 key 时,后面的 map 中的 key 将会被跳过
func MergeMapsWithSkip[M ~map[K]V, K comparable, V any](maps ...M) (result M) {
if len(maps) == 0 {
return nil
}
result = make(M)
for _, m := range maps {
for k, v := range m {
if _, ok := result[k]; !ok {
result[k] = v
}
}
}
return
}