從數學方面去介面

在數學上,特別是集理論,我們的事情,被稱為收集,我們命名這些事情元素。我們顯示一個名稱為 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{} 沒有任何特性,所以接受所有型別(因為它沒有任何用於區分值的過濾器)。