23.泛型
# 01.泛型
https://juejin.cn/post/7087951131510308901?searchId=2023120511385245A9329964073DB46379
# 1、泛型基本使用
- 假设我们需要实现一个反转切片的函数,如果没有泛型我们可能需要定义多种类型参数的处理函数
- 如果你发现自己多次编写完全相同的代码,而这些代码之间的唯一区别就是使用的类型不同,这个时候你就应该考虑是否可以使用类型参数
- 泛型的引入是为了配合接口的使用,让我们能够编写更加类型安全的Go代码,并能有效地减少重复代码。
package main
import "fmt"
func main() {
fmt.Println(reverseInt([]int{1, 2, 3, 4})) // [4 3 2 1]
fmt.Println(reverseAny([]int{1, 2, 3, 4})) // [4 3 2 1]
fmt.Println(reverseIntStr([]string{"a", "b", "c"})) // [c b a]
}
// reverseInt 只能传入int类型切片
func reverseInt(s []int) []int {
l := len(s)
r := make([]int, l)
for i, e := range s {
r[l-i-1] = e
}
return r
}
// reverseIntStr 只能传入int或string类型切片
func reverseIntStr[T int | string](s []T) []T {
l := len(s)
r := make([]T, l)
for i, e := range s {
r[l-i-1] = e
}
return r
}
// reverseAny 可以传入任意类型切片
func reverseAny[T any](s []T) []T {
l := len(s)
r := make([]T, l)
for i, e := range s {
r[l-i-1] = e
}
return r
}
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
30
31
32
33
34
35
36
37
38
39
40
41
42
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
30
31
32
33
34
35
36
37
38
39
40
41
42
# 2、类型参数
- 除了函数中支持使用类型参数列表外,类型也可以使用类型参数列表
ype Slice[T int | string] []T
type Map[K int | string, V float32 | float64] map[K]V
type Tree[T interface{}] struct {
left, right *Tree[T]
value T
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 作为类型约束使用的接口类型可以事先定义并支持复用
// Value 事先定义好的类型约束类型
type Value interface {
int | float64
}
func min[T Value](a, b T) T {
if a <= b {
return a
}
return b
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
上次更新: 2024/3/13 15:35:10