类型.实现和类型.满足有什么区别?

问题描述 投票:0回答:1

golang 中的 types.Implementstypes.Satisfies 有什么区别?

go types standard-library
1个回答
0
投票

方法名称与语言规范直接相关,因此首先查看它会有所帮助:

实施定义为:

类型 T 实现接口 I if

  • 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
}

Satisfying 仅用于接口constraints,定义为:

类型 T 满足约束 C if

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

正如您所看到的,“满意”的定义包括“实现”加上一个例外。

在 Go 1.20 之前,“满足”接口(任何接口)的概念并不存在。每个用例都被称为“实现”。

在 Go 1.20 中,引入了“满足”来扩展“实现约束”的定义,但对于必须满足

comparable
的类型有一个例外(上面引用中的第二个要点)。之前,尽管在非通用代码中支持
reflect.Type
[2]io.Reader
运算符,但
comparable
==
等类型并未实现
!=

换句话说,规范中可比较的定义与

comparable
约束的实际类型集之间存在不匹配。

因此,在实践中,类型可能“满足”

comparable
,但不属于其类型集。

更多信息:Go 泛型:映射键的类型约束?

© www.soinside.com 2019 - 2024. All rights reserved.