内容简介:比如《Go语言实战》中的一个例子:如何判断类型是否实现了某个接口?对一个接口赋值的时候,会拷贝类型信息和该类型的方法集。只要这个类型的方法集中包括这个接口的所有方法,那么它就是实现了这个接口,才能够赋值给这个接口。
比如《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: "abc@qq.com", } 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
方法。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- golang中接口赋值与方法集
- golang接口的使用:给实现类中属性赋值
- 少说话多写代码之Python学习023——赋值语句的用户02(链式赋值、增量赋值)
- 理解Golang多重赋值
- ES6 解构赋值
- 【ES6复习】解构赋值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网站运维技术与实践
饶琛琳 / 电子工业出版社 / 2014-3 / 69.00元
网站运维工作,一向以内容繁杂、覆盖面广著称。《网站运维技术与实践》选取日常工作涉及的监测调优、日志分析、集群规划、自动化部署、存储和数据库等方面,力图深入阐述各项工作的技术要点及协议原理,并介绍相关开源产品的实践经验。在技术之外,作者也分享了一些关于高效工作及个人成长方面的心得。 《网站运维技术与实践》适合Linux 系统管理员、中大型网站运维工程师及技术负责人、DevOps 爱好者阅读。同......一起来看看 《网站运维技术与实践》 这本书的介绍吧!