![](/style/images/good.png)
49
![](/style/images/bad.png)
Golang接口赋值和方法集
source link: https://studygolang.com/articles/18791?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
比如《Go语言实战》中的一个例子:
// compile error // cannot use u (type user) as type notifier in argument to sendNotification: // user does not implement notifier (notify
package main import "fmt" type user struct { name string email string } type notifier interface { notify() } func (u *user) notify() { fmt.Printf("sending user email to %s<%s>\n", u.name, u.email) } func sendNotification(n notifier) { n.notify() } func main() { u := user{ name: "stormzhu", email: "[email protected]", } sendNotification(u) } // compile error // cannot use u (type user) as type notifier in argument to sendNotification: // user does not implement notifier (notify method has pointer receiver)
如何判断类型是否实现了某个接口?
- 接口的定义
type iface struct { tab *itab // 类型信息 data unsafe.Pointer //实际对象指针 } type itab struct { inter *interfacetype // 接口类型 _type *_type // 实际对象类型 fun [1]uintptr // 实际对象方法地址 }
对一个接口赋值的时候,会拷贝类型信息和该类型的方法集。只要这个类型的方法集中包括这个接口的所有方法,那么它就是实现了这个接口,才能够赋值给这个接口。
- 方法集
-
类型
T
的方法集包含所有 receiverT
方法。 -
类型
*T
的方法集包含所有 receiverT
+*T
方法。 -
匿名嵌入
S
,类型T的方法集包含所有 receiverT
+S
方法。 -
匿名嵌入
*S
,类型T的方法集包含所有 receiverT
+S
+*S
方法。 -
匿名嵌入
S
或*S
,类型*T的方法集包含所有 receiverT
+*T
+S
+*S
方法。
总结:
-
T
和*T
不是一个类型,他们的方法集不同 -
类型
*T
的方法集包含所有 receiverT
+*T
方法,类型T
的方法集只包含所有 receiverT
方法。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK