编程时,我们通常需要编写“泛型”函数,其中确切的数据类型并不重要。例如,您可能想编写一个简单的函数来对数字进行求和。Go 直到最近才有这个概念,但最近才添加了它(从1.18版开始)。
Go 本身不是面向对象的,所以没有 Number
类。但是,您可以创建自己的通用 interfaces
,用于相同的功能。下面是如何在 Go 中解决同样的问题:
1
2
3
4
5
6
7
8
9
10
11
12
type Number interface {
uint | int | float32 | float64
}
func sum[T Number](a []T) T{
var summer T
for _, v := range(a) {
summer += v
}
return summer
}
如果将上述代码应用于整数数组,则在汇编中会得到以下紧循环:
1
2
3
4
5
6
pc11:
MOVQ (AX)(DX*8), SI
INCQ DX
ADDQ SI, CX
CMPQ BX, DX
JGT pc11
就 Go 而言,这是最有效的。
重要的是泛型与具体类型在实际应用中性能没有损失,这是 Go 编译器所做的事。
更多泛型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Complex interface {
~complex64 | ~complex128
}
type Float interface {
~float32 | ~float64
}
type Integer interface {
Signed | Unsigned
}
type Ordered interface {
Integer | Float | ~string
}
type Signed interface {
~int | ~int8 | ~int16 | ~int32 | ~int64
}
type Unsigned interface {
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
本文网址: https://golangnote.com/topic/312.html 转摘请注明来源