Go的指针类型与接口

Go中的指针类型有一个约定:任一指针具有其地址指带的实体(最常见的是结构体,当然也可以是字符串、数字或者其他指针等)的所有属性、方法,这样“智能”的设定下使得我们可以 *** f ***

使用类型B的实例b给接口类型A的变量a赋值时,根据B实现A中定义的方法的接收者类型的不同(指针还是值),b的类型(指针还是值)有一些约束:

1、接收者类型是指针:这种情况下方法可能存在副作用(可能导致对方法接收者的修改),而对于接口类型的变量,如果它的值的类型是“值”那么go无法从这个变量中获取指针(原因比较深奥),这个值只是一个副本,那么上述的方法“副作用”是无法实现的,所以go认为赋值给;

2、接收者类型是值:方法没有副作用,方法内的值是个实际值副本,所以b不论为指针还是实例,接收者方法都不会有副作用,这时go不会强行要求;

由于Go中没有方法重载机制,所以以上同名方法只能存在一个。

另,要分清方法中的方法接收者和方法参数,当不讨论接口类型的赋值时,定义方法时不论将接收声明为指针还是实例,在调用方法时go都将自动将接收者转换为合适的类型(是否有副作用得看方法内部实现);而方法参数的类型是严格规定好的,无法进行转换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,144评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,860评论 2 9
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,058评论 0 13
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,374评论 0 6
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,907评论 0 38