本文介绍: 比如在C++中,编译器使用抽象数据类型的泛型来将运行时运算(确定所使用的实体类型)转化为编译时运算,为每种实体类型生成独立的函数。为区分传递给共享生成函数的类型,编译器添加了额外的运行时查询。就像类型元素用于指定可替换类型参数的类型一样,和类型可用于变量参数中的接口。Go也不支持函数或方法重载,那就需要为不同的类型指定不同的运算函数。Go 1.18的编译器要慢于之前的版本,但Go 1.20的编译器解决了这一问题。Go仍是一种小型且聚焦的编程语言,Go对泛型的实现并未包含部分在其它语言泛型中存在的特性。
类型推导和泛型
就像在使用:=
时支持类型推导一样,在调用泛型函数时Go同样支持类型推导。可在上面对Map
、Filter
和Reduce
调用中看出。有些场景无法进行类型推导(如类型参数仅用作返回值)。这时,必须指定所有的参数类型。下面的代码演示了无法进行类型推导的场景:
可在The Go Playground 或第8章的GitHub代码库的sample_code/type_inference目录下测试这段代码。
类型元素限定常量
类型元素也可指定哪些常量可赋值给泛型变量。和运算符一样,常需要对类型元素中的所有类型名有效。没有常量可同时赋值给Ordered
中列出的所有类型,因此无法将一个常量赋值给该泛型类型的变量。如果使用Integer
接口,以下代码无法编译通过,因为不能将1,000赋值给8位的整型:
但下面的就是有效的:
组合泛型函数和泛型数据结构
回到二叉树示例,来看如何使用所学的知识生成适用所有实体类型的树。
再谈可比较类型
未实现的功能
地道的Go和泛型
向标准库添加泛型
解锁未来特性
小结
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。