go泛型

使用 [] 定义泛型

1
2
3
4
5
6
7
func SumInt64OrFloats[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
​ s += v
}
return s
}

使用 type

1
2
3
4
5
6
7
8
9
10
11
12
13
type Number interface {

​ int64 | float64

}

func SumInt64OrFloats[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}

使用泛型定义Stack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type stack [T any] []T

func (s *stack[T]) push(elem T) {
*s = append(*s, elem)
}

func (s *stack[T]) pop() {
if len(*s) > 0 {
*s = (*s)[:len(*s)-1]
}
}
func (s *stack[T]) top() *T{
if len(*s) > 0 {
return &(*s)[len(*s)-1]
}
return nil
}

func (s *stack[T]) len() int{
return len(*s)
}

func (s *stack[T]) print() {
for _, elem := range *s {
fmt.Print(elem)
fmt.Print(" ")
}
fmt.Println("")
}

使用泛型来实现map函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func gMap[T1 any, T2 any] (arr []T1, f func(T1) T2) []T2 {
result := make([]T2, len(arr))
for i, elem := range arr {
result[i] = f(elem)
}
return result
}

nums := []int {0,1,2,3,4,5,6,7,8,9}
squares := gMap(nums, func (elem int) int {
return elem * elem
})
print(squares) //0 1 4 9 16 25 36 49 64 81

strs := []string{"Hao", "Chen", "MegaEase"}
upstrs := gMap(strs, func(s string) string {
return strings.ToUpper(s)
})
print(upstrs) // HAO CHEN MEGAEASE


dict := []string{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}
strs = gMap(nums, func (elem int) string {
return dict[elem]
})
print(strs) // 零 壹 贰 叁 肆 伍 陆 柒 捌 玖

使用泛型来实现reduce函数

1
2
3
4
5
6
7
8
9
10
11
12
13
func gReduce[T1 any, T2 any] (arr []T1, init T2, f func(T2, T1) T2) T2 {
result := init
for _, elem := range arr {
result = f(result, elem)
}
return result
}

nums := []int {0,1,2,3,4,5,6,7,8,9}
sum := gReduce(nums, 0, func (result, elem int) int {
return result + elem
})
fmt.Printf("Sum = %d \n", sum)

使用泛型来实现filter函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func gFilter[T any] (arr []T, in bool, f func(T) bool) []T {
result := []T{}
for _, elem := range arr {
choose := f(elem)
if (in && choose) || (!in && !choose) {
result = append(result, elem)
}
}
return result
}

func gFilterIn[T any] (arr []T, f func(T) bool) []T {
return gFilter(arr, true, f)
}

func gFilterOut[T any] (arr []T, f func(T) bool) []T {
return gFilter(arr, false, f)
}

来源 Go编程模式 : 泛型编程 | 酷 壳 - CoolShell

作者

建指所向

发布于

2022-01-24

更新于

2023-11-07

许可协议