咱们先看下面一个使用接口的小例子:
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,年轻的后端攻城狮一枚,爱钻研,爱技术,爱分享。
我的笔记,整理不易,感谢阅读、点赞和收藏。
文章有任何问题欢迎你们指出,也欢迎你们一块儿交流后端各类问题!后端