Go语言1.18+版本的泛型浅析及代码示例
泛型程序设计(generic programming)是程序设计语言的一种风格或范式。
泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。
一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。
对于slice、map、channel等类型,如果它们的元素类型是不确定的,操作这类类型的函数可以考虑用泛型,一些通用目的的数据结构,比如前面提到的二叉树等,如果一些函数行为相同,只是类型不同,可以考虑用泛型重构。
**Go 1.18 或更高版本的安装
类型形参 (Type parameter)
类型实参 (Type argument)
类型形参列表 (Type parameter list)
类型约束 (Type constraint)
实例化 (Instantiations)
泛型类型 (Generic type)
泛型接收器 (Generic receiver)
泛型函数 (Generic function)
泛型三大要素:Type Parameters、Type Sets 和 Type Inference,
** 即:类型参数、类型集合和类型推断。
**泛型并不取代 Go1.18 之前用接口 + 反射实现的动态类型
泛型示例代码
package main
import "fmt"
type Number interface {
int64 | float64
}
func main() {
//为整数值初始化一个map
ints := map[string]int64{
"first": 34,
"second": 12,
}
//为浮动值初始化一个map
floats := map[string]float64{
"first": 35.98,
"second": 26.99,
}
fmt.Printf("非通用型 总数: %v and %v\n",
SumInts(ints),
SumFloats(floats))
fmt.Printf("通用型 总数: %v and %v\n",
SumIntsOrFloats[string, int64](ints),
SumIntsOrFloats[string, float64](floats))
fmt.Printf("通用型 总数, 推断出的类型参数: %v and %v\n",
SumIntsOrFloats(ints),
SumIntsOrFloats(floats))
fmt.Printf("带有约束条件的通用总和: %v and %v\n",
SumNumbers(ints),
SumNumbers(floats))
}
//SumInts将m的值加在一起。
func SumInts(m map[string]int64) int64 {
var s int64
for _, v := range m {
s += v
}
return s
}
//SumFloats将m的值加在一起。
func SumFloats(m map[string]float64) float64 {
var s float64
for _, v := range m {
s += v
}
return s
}
// SumIntsOrFloats对map m的值进行求和,它同时支持浮点数和整数。
// 作为map值。
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
// SumNumbers对map m的值进行求和,它同时支持整数和浮点数作为map值。
// 和浮点数作为map值。
func SumNumbers[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
相关文章