编辑
2024-09-12
Know Go Generics
0

目录

Contains
Reverse
Sort
Map
Filter
Reduce

一些特定功能的泛型函数例子。

Contains

判断某元素是否包含在指定 slice 中。

go
func Contains[E comparable](s []E, v E) bool { for _, vs := range s { if v == vs { return true } } return false }

官方 exp 包的实现:Contains

Reverse

反向 slice 中的元素。

go
func 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

Sort

go
func 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

这里的 map 指把一个值映射为另一个值。

go
type 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)) }

Filter

从 slice 中找出要保留的元素。

go
type 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])) }

Reduce

用于合并 slice 中的元素,比如对 slice 中的数字求和。

go
type 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 许可协议。转载请注明出处!