GolangNote

Golang笔记

Golang 泛型性能初识

Permalink

编程时,我们通常需要编写“泛型”函数,其中确切的数据类型并不重要。例如,您可能想编写一个简单的函数来对数字进行求和。Go 直到最近才有这个概念,但最近才添加了它(从1.18版开始)。

Golang 泛型

Go 本身不是面向对象的,所以没有 Number 类。但是,您可以创建自己的通用 interfaces ,用于相同的功能。下面是如何在 Go 中解决同样的问题:

Go: Number
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
}

如果将上述代码应用于整数数组,则在汇编中会得到以下紧循环:

GAS:
1
2
3
4
5
6
pc11:
        MOVQ    (AX)(DX*8), SI
        INCQ    DX
        ADDQ    SI, CX
        CMPQ    BX, DX
        JGT     pc11

就 Go 而言,这是最有效的。

重要的是泛型与具体类型在实际应用中性能没有损失,这是 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 转摘请注明来源

Related articles

Golang Range 的性能提升Tip

Go 语言里使用 range 可以方便遍历数组(array)、切片(slice)、字典(map)和信道(chan)。这里主要关注他们的性能。...

Golang 单实例实现网站多域名请求

有时候写网站,为了统一的后端,把不同业务都集中到一个后端,这时就需要处理多域名的请求,在 Go http server 里实现很简单,只需把不同域名映射到不同的 `http.Handler`。...

Write a Comment to "Golang 泛型性能初识"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.22.3 Processed in 0ms