在golang中,类型.实现和类型.满足有什么区别?我正在研究一个检查Go AST的代码。
0ejtzxu11#
tl;dr
一个类型可以“满足”comparable而不“实现”它,即不属于它的类型集。方法名称与语言规范直接相关,因此首先查看它会有所帮助:实施定义为:类型T实现接口I,如果
comparable
“类型集”的概念也在规范中定义,这取决于你考虑的是什么类型的接口。基本接口是那些只包含方法的接口,类型集是实现这些方法的所有类型的集合,例如:
// type set includes all types with the method Read (signature must match) type Reader interface { Read([]byte) (int, error) }
字符集非基本接口是那些包含类型项(以及零个或多个方法)的接口,类型集是指定类型的集合。如果任何项是近似的,例如~int,则该集合包括以int作为底层类型的类型。
~int
int
// type set includes int, string and anything with int or string as underlying type type Foo interface { ~int | ~string }
型满足仅用于接口 * 约束 *,定义为:一个类型T满足一个约束C,如果
正如你所看到的,“令人满意”的定义包括“实现”和一个例外。在Go 1.20之前,“满足”接口的概念-任何接口-都不存在。每个用例都被称为“实现”。在Go 1.20中,引入了“satisfying”来扩展“实现约束”的定义,但对于必须满足comparable的类型有一个例外(上面引用中的第二个要点)。在此之前,reflect.Type或[2]io.Reader等类型并不实现comparable,尽管在非泛型代码中支持==和!=运算符。换句话说,根据规范,comparable的定义与comparable约束的实际类型集之间不匹配。更多信息:Go泛型:Map键的类型约束?
reflect.Type
[2]io.Reader
==
!=
1条答案
按热度按时间0ejtzxu11#
tl;dr
一个类型可以“满足”
comparable
而不“实现”它,即不属于它的类型集。方法名称与语言规范直接相关,因此首先查看它会有所帮助:
实施定义为:
类型T实现接口I,如果
“类型集”的概念也在规范中定义,这取决于你考虑的是什么类型的接口。基本接口是那些只包含方法的接口,类型集是实现这些方法的所有类型的集合,例如:
字符集
非基本接口是那些包含类型项(以及零个或多个方法)的接口,类型集是指定类型的集合。如果任何项是近似的,例如
~int
,则该集合包括以int
作为底层类型的类型。型
满足仅用于接口 * 约束 *,定义为:
一个类型T满足一个约束C,如果
正如你所看到的,“令人满意”的定义包括“实现”和一个例外。
在Go 1.20之前,“满足”接口的概念-任何接口-都不存在。每个用例都被称为“实现”。
在Go 1.20中,引入了“satisfying”来扩展“实现约束”的定义,但对于必须满足
comparable
的类型有一个例外(上面引用中的第二个要点)。在此之前,reflect.Type
或[2]io.Reader
等类型并不实现comparable
,尽管在非泛型代码中支持==
和!=
运算符。换句话说,根据规范,comparable的定义与
comparable
约束的实际类型集之间不匹配。更多信息:Go泛型:Map键的类型约束?