咱們先看下面一個使用接口的小例子:
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和變量的地址就會被賦值,具體以下圖所示。
![]()
從上圖能夠看出, 在接口變量的內部,傳入變量的類型信息,方法集和變量的地址被存儲在一個結構體中,當調用接口提供的方法時,接口就會在它保存的實體類型裏去找對應方法的實現,而後調用其來完成相應操做。
這期的內容比較簡短,但比較重要啊 ~~~
我是lioney,年輕的後端攻城獅一枚,愛鑽研,愛技術,愛分享。
我的筆記,整理不易,感謝閱讀、點贊和收藏。
文章有任何問題歡迎你們指出,也歡迎你們一塊兒交流後端各類問題!後端