Go语言 类型,实现和类型,满足有什么区别?

20jt8wwn  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(87)

在golang中,类型.实现和类型.满足有什么区别?
我正在研究一个检查Go AST的代码。

0ejtzxu1

0ejtzxu11#

tl;dr

一个类型可以“满足”comparable而不“实现”它,即不属于它的类型集。
方法名称与语言规范直接相关,因此首先查看它会有所帮助:
实施定义为:
类型T实现接口I,如果

  • T不是一个接口,并且是I的类型集的元素;或者
  • T是一个接口,T的类型集是I的类型集的子集。

“类型集”的概念也在规范中定义,这取决于你考虑的是什么类型的接口。基本接口是那些只包含方法的接口,类型集是实现这些方法的所有类型的集合,例如:

// type set includes all types with the method Read (signature must match)
type Reader interface {
    Read([]byte) (int, error)
}

字符集
非基本接口是那些包含类型项(以及零个或多个方法)的接口,类型集是指定类型的集合。如果任何项是近似的,例如~int,则该集合包括以int作为底层类型的类型。

// type set includes int, string and anything with int or string as underlying type
type Foo interface {
    ~int | ~string
}


满足仅用于接口 * 约束 *,定义为:
一个类型T满足一个约束C,如果

  • T实施C;或
  • C可以写成接口{ comparable; E }的形式,其中E是基本接口,T是comparable并实现E。

正如你所看到的,“令人满意”的定义包括“实现”和一个例外。
在Go 1.20之前,“满足”接口的概念-任何接口-都不存在。每个用例都被称为“实现”。
在Go 1.20中,引入了“satisfying”来扩展“实现约束”的定义,但对于必须满足comparable的类型有一个例外(上面引用中的第二个要点)。在此之前,reflect.Type[2]io.Reader等类型并不实现comparable,尽管在非泛型代码中支持==!=运算符。
换句话说,根据规范,comparable的定义与comparable约束的实际类型集之间不匹配。
更多信息:Go泛型:Map键的类型约束?

相关问题