博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go方法的深入探究(7.21增补)
阅读量:5951 次
发布时间:2019-06-19

本文共 1498 字,大约阅读时间需要 4 分钟。

hot3.png

1)哪些类型可以有方法:
        1)只能对命名类型和命名类型的指针编写方法;
        2)不能对接口类型和接口类型的指针编写方法;
        3)只能在定义命名类型的那个包编写其方法。
2)receiver是值的方法,编译器会隐式的生成一个receiver是对应类型指针的同名方法。反过来却不会。
3)结构体的匿名字段的类型限制:
        1)不可以是未命名类型;
        2)可以是命名类型或命令类型的指针类型;
        3)接口类型可以,接口类型的指针类型不行;
4)结构体匿名字段的方法向外传递的规则:
        1)匿名字段为值类型时:值的方法会传递给结构体的值,指针的方法会传递给结构体的指针;
        2)匿名字段为指针类型时:指针的方法会传递给值和指针;
        3)匿名字段为接口类型时:方法会传递给值和指针;
5)匿名字段的方法,是被经过包装实现为外围结构体的方法。
6)使用具体的类型去调用方法时。
        首先,编译器查看该类型下有没有该方法;
        其次,扩展查看该类型的指针类型或者基类型(如果该类型是指针类型);
        最后,如果以上查找都未找到,则会报错。
       
注:扩展查看不会查看隐式实现的方法(匿名字段传递出来的方法、值=>指针隐式实现的方法)
7)具体类型的方法集是以该类型为receiver的方法的集合。
8)接口类型的方法集就是其定义里声明的方法,接口调用方法时类似C++调用虚函数;接口的指针没有方法集。
9)类型存入接口时只检查方法集;调用接口的方法时也只检查方法集;reflect包同样只查看方法集。
因此:
类型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 := &ac := &ba.X() // okb.X() // okc.X() // errora.Y() // okb.Y() // okc.Y() // okvar ix IXix = a // okix = b // okix = c // errorvar iy IYiy = a // erroriy = b // okiy = c // errorvar jx IXjx = ix  // okjx = &ix // error

对于代码:

type I interface {	IE()}type A intfunc (_ A) VA() {}func (_ *A) PA() {}type B struct {	I}func (_ B) VB() {}func (_ *B) PB() {}type C struct {	A}func (_ C) VC() {}func (_ *C) PC() {}type D struct {	*A}func (_ D) VD() {}func (_ *D) PD() {}

下面的列表说明了其方法集和方法的来源:

type(类型) explicit(显式定义的方法)
 implicit(隐式实现的方法)
 inherit(继承自匿名字段的方法)
I IE
*I
A VA
*A PA VA
B VB
IE
*B PB VB IE
C VC
VA
*C PC VC PA,VA
D VD
PA,VA
*D PD VD PA,VA

转载于:https://my.oschina.net/liudiwu/blog/292698

你可能感兴趣的文章
为linux扩展swap分区
查看>>
python \uxxxx转中文,Python列表中的字典 \uxxxx转中文,
查看>>
tomcat配置访问项目时不需要加项目名称
查看>>
转JMeter 利用Jmeter批量数据库插入数据
查看>>
在多模块开发的时候,利用项目继承可以将结构信息、部署信息,将共同的依赖放在一个父类中。...
查看>>
[原创] IAR7.10安装注册教程
查看>>
Java图像渐变
查看>>
解决ios下的微信打开的页面背景音乐无法自动播放(转载)
查看>>
fidder设置断点,修改请求参数等
查看>>
Material Design之RecyclerView的使用(一)
查看>>
系统编程是什么
查看>>
git rebase简介(基本篇)
查看>>
Backup and Recovery Basics1
查看>>
C语言各种keyword
查看>>
Rescue
查看>>
1775. [国家集训队2010]小Z的袜子
查看>>
前端学习 -- Html&Css -- 表单
查看>>
android的toogleButton和switch的使用方法
查看>>
CSS网页布局垂直居中整理
查看>>
HTML标签列表
查看>>