深入理解Go語言實現多態 

多態是什麼

相信學過Java這種面向對象語言的同學對於多態來說都不陌生,在代碼執行的時候,能夠根據子類的類型去執行子類當中的方法。多態是指代碼可以根據類型的具體實現采取不同行為的能力。如果一個類型實現瞭某個接口,所有使用這個接口的地方,都可以支持這種類型的值。

Go語言多態舉例

有這樣一個場景,我們在應用開發中涉及到很多通知事件,通知的類型可以是通過微信、QQ、Email等,那麼我們可以抽象出一個接口,定義一個通知的接口,然後微信通知類、QQ通知類、Email通知類分別實現對應的通知方法。

定義一個通知類型:notifier

// 通知者接口
type Notifier interface {
    // 通知方法,可以由具體的類進行實現
    notify()
}

定義微信類型、QQ類型、Email類型,並實現notify方法,以指針類型作為方法的接收者

type WechatNotifier struct {
    Name    string
    Message string
}

func (w *WechatNotifier) notify() {
    fmt.Printf("%v notify %v \n", w.Name, w.Message)
}

type QQNotifier struct {
    Name    string
    Message string
}

func (q *QQNotifier) notify() {
    fmt.Printf("%v notify %v \n", q.Name, q.Message)
}

type EmailNotifier struct {
    Name    string
    Message string
}

func (e *EmailNotifier) notify() {
    fmt.Printf("%v notify %v \n", e.Name, e.Message)
}

定義發送通知方法,入參為Notifier;等需要調用的時候,需要傳入實現瞭Notifier中的接口的類型

func sendNotify(notifier Notifier) {
    notifier.notify()
}

測試一下

func main() {
    w := &WechatNotifier{
        Name:    "微信",
        Message: "微信消息",
    }

    q := &QQNotifier{
        Name:    "QQ",
        Message: "QQ消息",
    }

    e := &EmailNotifier{
        Name:    "Email",
        Message: "Email消息",
    }

    // 接受微信類型
    sendNotify(w)
    // 接受QQ類型
    sendNotify(q)
    // 接受Email類型
    sendNotify(e)
}

測試結果如下:

總結

Golang中主要是采用瞭接口來實現多態,先定義一個抽象接口,然後再定義具體的實現類並實現接口中的方法,當我們需要定義一個通用的方法時,方法的入參可以接收一個接口類型,這樣在程序設計的時候就可以不必多寫類似的方法從而接受不同的類瞭,在程序的運行時,就可以動態地把該接口指向的具體類型,從而執行具體類型的方法!

到此這篇關於深入理解Go語言實現多態 的文章就介紹到這瞭,更多相關Go語言 多態 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: