从数学方面去接口

在数学上,特别是集理论,我们的事情,被称为收集,我们命名这些事情元素。我们显示一个名称为 A,B,C,……的集合,或明确地将其成员放在括号表示法上:{a,b,c,d,e}。假设我们有一个任意元素 x 和一个集合 Z,关键问题是:“我们如何理解 x 是否是 Z 的成员?”。数学家用一个概念回答这个问题: 一组特征属性。集合的特征属性是完全描述集合的表达式。例如,我们有一组自然数,即{0,1,2,3,4,5,…}。我们可以用这个表达式描述这个集合:{a n | a 0 = 0,a n = a n-1 +1}。在最后一个表达式中, 0 = 0, n = a n-1 + 1 是自然数集的特征性质。如果我们有这个表达式,我们可以完全构建这个集合。让我们以这种方式描述一组偶数。我们知道这个集合是由这些数字组成的:{0,2,4,6,8,10,…}。一眼就能看出所有这些数字也是一个自然数,换句话说,如果我们为自然数的特征属性添加一些额外的条件,我们可以构建一个描述这个数的新表达式。所以我们可以用这个表达式来描述:{n | n 为自然数的成员 n 个 2 为零}提醒。现在我们可以创建一个过滤器,它获取集合的特征属性并过滤一些所需的元素以返回集合的元素。例如,如果我们有一个自然数字过滤器,自然数和偶数都可以通过这个过滤器,但如果我们有一个偶数过滤器,那么像 3 和 137871 这样的元素不能通过过滤器。

Go 中接口的定义就像定义特征属性和使用接口的机制一样,函数的参数就像一个过滤器,它检测元素是否是我们想要的集合的成员。让我们用代码描述这个方面:

type Number interface {
    IsNumber() bool // the implementation filter "meysam" from 3.14, 2 and 3
}

type NaturalNumber interface {
    Number
    IsNaturalNumber() bool // the implementation filter 3.14 from 2 and 3
}

type EvenNumber interface {
    NaturalNumber
    IsEvenNumber() bool // the implementation filter 3 from 2
}

Number 的特征是所有具有 IsNumber 方法的结构,NaturalNumber 是所有具有 IsNumberIsNaturalNumber 方法的结构,最后 EvenNumber 是所有具有 IsNumberIsNaturalNumberIsEvenNumber 方法的类型。由于接口的这种解释,我们很容易理解,因为 interface{} 没有任何特性,所以接受所有类型(因为它没有任何用于区分值的过滤器)。