首页 > 代码库 > go方法的深入探究
go方法的深入探究
>1)只能对命名类型和命名类型的指针编写方法(即方法的接收者必须是命名类型的值/指针),二级或多级指针是不行的。同时,你只能在定义命名类型的那个包编写其方法,另外的包里是不行的。
2)当你写了一个方法之后,如果接收者是命名类型的值,编译器会自动包装出一个接收者是命名类型的指针的同名方法。如果接收者是命名类型的指针,编译器却不会干额外的活。
3)使用具体的类型去调用方法时。首先,编译器查看该类型下有没有该方法?没有,扩展查看该类型的指针类型或者基类型(如果该类型是指针类型)有没有该方法?再没有,那没办法,报错吧。(注意不会迭代)
4)编译器隐式实现的方法,直接查找能找到;接口检验时会查找到;reflect包也可以查找到;在扩展查找时却是看不到的。
5)类型要放进接口时,检查是否满足接口(实现没实现接口要求的方法时),编译器只会查找该类型实现了的方法,不会去查找该类型的指针/基类型的方法。
6)接口类型没有方法集!切记这一点,接口调用方法时类似C++调用虚函数,接口类型的指针是不能调用接口类型的方法的。
因此:
类型A的方法,A和*A都可以调用;
类型A的方法,虽然隐式实现了类型*A的方法,**A却不能调用;
类型*A的方法,A、*A、**A都可以调用;
不能实现**A的方法;
2)当你写了一个方法之后,如果接收者是命名类型的值,编译器会自动包装出一个接收者是命名类型的指针的同名方法。如果接收者是命名类型的指针,编译器却不会干额外的活。
3)使用具体的类型去调用方法时。首先,编译器查看该类型下有没有该方法?没有,扩展查看该类型的指针类型或者基类型(如果该类型是指针类型)有没有该方法?再没有,那没办法,报错吧。(注意不会迭代)
4)编译器隐式实现的方法,直接查找能找到;接口检验时会查找到;reflect包也可以查找到;在扩展查找时却是看不到的。
5)类型要放进接口时,检查是否满足接口(实现没实现接口要求的方法时),编译器只会查找该类型实现了的方法,不会去查找该类型的指针/基类型的方法。
6)接口类型没有方法集!切记这一点,接口调用方法时类似C++调用虚函数,接口类型的指针是不能调用接口类型的方法的。
因此:
类型A的方法,A和*A都可以调用;
类型A的方法,虽然隐式实现了类型*A的方法,**A却不能调用;
类型*A的方法,A、*A、**A都可以调用;
不能实现**A的方法;
type A ... func (a A)X(){} func (a *A)Y(){} type IX interface{ X() } type IY interface{ Y() } a := A{} b := &a c := &b a.X() // ok b.X() // ok c.X() // error a.Y() // ok b.Y() // ok c.Y() // ok var ix IX ix = a // ok ix = b // ok ix = c // error var iy IY iy = a // error iy = b // ok iy = c // error var jx IX jx = ix // ok jx = &ix // error
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。