一些特定功能的泛型函数例子。
判断某元素是否包含在指定 slice 中。
gofunc Contains[E comparable](s []E, v E) bool {
for _, vs := range s {
if v == vs {
return true
}
}
return false
}
官方 exp 包的实现:Contains
反向 slice 中的元素。
gofunc Reverse[E any](s []E) []E {
result := make([]E, 0, len(s))
for i := len(s) - 1; i >= 0; i-- {
result = append(result, s[i])
}
return result
}
官方 exp 包的实现:Reverse
gofunc Sort[E constraints.Ordered](s []E) []E {
result := make([]E, len(s))
copy(result, s)
sort.Slice(result, func(i, j int) bool {
return result[i] < result[j]
})
return result
}
官方 exp 包的实现:Sort
这里的 map 指把一个值映射为另一个值。
gotype mapFunc[E any] func(E) E
func Map[E any](s []E, f mapFunc[E]) []E {
result := make([]E, len(s))
for i := range s {
result[i] = f(s[i])
}
return result
}
// 映射函数使用了标准库函数 ToUpper
func Upper() {
s := []string{"a", "b", "c"}
fmt.Println(Map(s, strings.ToUpper))
}
从 slice 中找出要保留的元素。
gotype keepFunc[E any] func(E) bool
func Filter[E any](s []E, f keepFunc[E]) []E {
result := []E{}
for _, v := range s {
if f(v) {
result = append(result, v)
}
}
return result
}
func IsEven[T constraints.Integer](v T) bool {
return v%2 == 0
}
func TestEven() {
s := []int{1, 2, 3, 4}
// 使用字面量
fmt.Println(Filter(s, func(v int) bool {
return v%2 == 0
}))
// 使用泛型函数
fmt.Println(Filter(s, IsEven[int]))
}
用于合并 slice 中的元素,比如对 slice 中的数字求和。
gotype reduceFunc[E any] func(cur, next E) E
func Reduce[E any](s []E, init E, f reduceFunc[E]) E {
cur := init
for _, v := range s {
cur = f(cur, v)
}
return cur
}
// 求和
func Sum() {
s := []int{1, 2, 3, 4}
sum := Reduce(s, 0, func(cur, next int) int {
return cur + next
})
fmt.Println(sum)
}
其他 reduce 操作
go//
func Multiplication() {
s := []int{1, 2, 3, 4}
p := Reduce(s, 1, func(cur, next int) int {
return cur * next
})
fmt.Println(p)
}
func JoinString() {
s := []string{"a", "b", "c"}
j := Reduce(s, "", func(c, n string) string {
return c + n
})
fmt.Println(j)
}
本文作者:jdxj
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!