go語言雜談----接口的內存佈局

圖片.png

1. 接口的功能

  • 接口是用來定義行爲的類型。這些被定義的行爲不禁接口實現,而是經過方法由用戶定義的類型實現。
  • 若是用戶定義的類型實現了某個接口聲明的所有方法,那麼這個用戶定義的類型的變量就能夠賦給這個接口類型的變量。
  • 用戶定義的任何類型均可以實現接口,因此對接口類型變量的調用就能夠造成多態調用。

2. 接口變量的內存佈局

咱們先看下面一個使用接口的小例子:
package main

    import "fmt"

    // 自定義接口
    type notifier interface {
        notify()
    }

    // 定義一個多態調用的函數
    func sendNotification(n notifier) {
        n.notify()
    }

    // 自定義類型
    type user struct {
        name  string
        email string
    }

    // 實現notifier接口的方法
    func (u *user) notify() {
        // 模擬發郵件的功能
        fmt.Printf("Send email to %s.\n", u.name)
    }

    func main() {
        u := user{
            name:  "lioney",
            email: "lioney_liu@sina.com",
        }
        sendNotification(&u)  // Send email to lioney.
    }
接口變量是一個佔有兩個字長度的數據結構,第一個字包含一個指向內部表的指針,叫iTable,iTable包含了所存儲變量的類型信息以及和這個變量相關的方法集。第二個字是一個指向所存儲變量的指針。當上述代碼執行sendNotification(&u),iTable和變量的地址就會被賦值,具體以下圖所示。
圖片.png
從上圖能夠看出, 在接口變量的內部,傳入變量的類型信息,方法集和變量的地址被存儲在一個結構體中,當調用接口提供的方法時,接口就會在它保存的實體類型裏去找對應方法的實現,而後調用其來完成相應操做。

參考文獻

  1. William Kennedy等《Go語言實戰》第5章相關內容

這期的內容比較簡短,但比較重要啊 ~~~

我是lioney,年輕的後端攻城獅一枚,愛鑽研,愛技術,愛分享。
我的筆記,整理不易,感謝閱讀、點贊和收藏。
文章有任何問題歡迎你們指出,也歡迎你們一塊兒交流後端各類問題!後端

相關文章
相關標籤/搜索