9.5.1 类型约束

类型约束是限制给定类型参数的允许类型的规范。

更具体地说,Go中的类型约束是定义相应类型参数的允许类型集的接口。它有效地指定了该类型参数值支持的操作。

Go总是需要类型约束,即使它只是any。例如,

[T any]                               // T本质上没有限制
[C comparable]                        // comparable是标准库中定义的接口
[D ~[]E, E comparable]                // 第一个类型参数D在其类型约束中使用第二个类型参数E
[S interface{ string | ~[]byte }]     // 匿名接口定义被用作类型约束
[_ any]                               // 可以使用空标识符作为类型参数

任何接口都可以用作泛型类型约束。后面的书会更详细地讲解Go接口。

any

Go 1.18中首次引入的预声明名称any是interface{}的别名。任何的类型约束意味着对应的类型参数没有约束。

comparable

Go 1.18中首次引入的预声明接口类型comparable不包括任何特定方法。这个特殊接口的唯一目的是表示所有“可比较”的具体(非接口)类型的集合。

如果满足以下条件,则认为类型T实现了comparable:

  • T是非接口类型且T支持==和!=操作;或

  • T是接口类型且T的类型集中的每个类型都实现了comparable

最后更新于