今天golang终于发布了1.18版本,这个版本最大的一个改变就是加入了泛型。虽然没有在beta版本的时候尝试泛型,但是由于在其他语言的泛型经验,入手泛型不是件难事~
官方示例
Tutorial: Getting started with generics - The Go Programming Language
根据官方示例可以看出,在go中泛型声明使用中括号,大体用法也与其他语言差不多。下面就官方示例中出现的几个点做记录。
comparable
在泛型的约束中有 comparable 关键字,我们进到源码中看到解释:
// comparable is an interface that is implemented by all comparable types
// (booleans, numbers, strings, pointers, channels, arrays of comparable types,
// structs whose fields are all comparable types).
// The comparable interface may only be used as a type parameter constraint,
// not as the type of a variable.
type comparable interface{ comparable }
看得出来这是官方定义的一个可比较的类型的一个泛型约束,它也只能存在于类型参数约束的时候。
一些改变 我们尝试修改官方示例,体验一下其他的关键词及相关用法。
~ 波浪号 我们会在一些泛型示例中看到这样的声明:
type Number interface {
~int64 | float64 | string
}
~ 在这里应该可以理解为 泛类型 ,即所有以
int64
为基础类型的类型都能够被约束。我们来举个例子:现在我们声明一个以
int64
为基础类型,取名为testInt
type testInt int64type Number interface {
~int64
}func SumIntsOrFloats[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}func main() {
ints := map[string]testInt{
"first":34,
"second": 12,
}fmt.Printf("Generic Sums: %v\n",
SumIntsOrFloats(ints))
}
在这个示例中,可以看到我们将
testInt
作为自定义类型传入了泛型方法中,在这种情况下,如果不给Number
中的int64
加~
,这里就会报错。加上~
之后代表以int64
为基本类型的自定义类型也可以通过泛型约束。未发布的内容 【go1.18泛型的简单尝试】在泛型的测试阶段,有一个
constraints
包被加入到源码中,这个包里面声明了一些官方定义的约束,但是在正式的发布版中却被去掉了。推荐阅读
- Go 1.18 正式发布!
- 【第四十二期】米哈游后台golang开发面经
- golang 简单工厂模式
- golang|什么才是 TDD 的正确打开方式()
- 【第四十期】shopee-golang后台一面面经
- go excelize 批量写入数据到Excel
- 【Go进阶—基础特性】接口
- 拓端tecdat|拓端tecdat|R语言多变量广义正交GARCH(GO-GARCH)模型对股市高维波动率时间序列拟合预测
- Go语言|Go语言编程笔记1(Hello World)