一、字段
匿名字段
结构体匿名字段
type Person struct{
}
type Student struct{
Person
}
指针型匿名字段
指针型匿名字段在创建时,需要进行赋值,如果不赋值需要进行动态内存分配出新的空间,例:
stu.person = new(person)
同名字段
type person struct{
name string
}
type student{
person
name string
}
二、方法
思维导图
一、方法的基本创建
1.基本数据类型方法
方法的本质还是函数,但是方法与函数还是有区别的。
先定义一个传统函数:
再定义一个方法
相比较一下,
(1)方法在func关键字后添加(numOne Int),这个称之为方法的·接收者。所谓的方法接收者就是接收传递过来的第一个参数,然后复制它。
(2)方法就是给某个类型绑定函数,因为int是系统给定的,所以无法直接给int绑定函数,需要通过type给int赋予别名
(3)方法的调用需要创建对象,然后通过对象名打点调用方法,a.Test(20)
2.结构体类型方法
(1)方法接收者为结构体类型
接受者类型为结构体类型时,因为结构体参数是按值传递的,所以在方法中修改结构体值是没有作用的。
(2)方法接收者为结构体指针类型
接受者类型为结构体类型时,因为结构体指针参数是按地址传递的,所以在方法中可以修改结构体值。
在方法中(*p).name 等同于 p.name(在前面结构体中已经讲到过)
所以为了方便起见,建议使用结构体指针作为接收者
二、方法的继承
只要在子类当中添加父类的匿名字段就可以继承父类中的所有属性和方法
(1)添加父类匿名字段
(2)添加父类匿名字段的指针
使用指针时,其中第二种和第三种方法因为指针没有初始化,其值为0x0空地址不允许使用,所以利用new给创建一个大小为Person的空间,并将该空间的地址赋值给tea.Person
(3)多重继承
【1】B继承A,C继承B
【2】C继承A和B
(4)其它
【1】继承自己的类型(不可用)
会造成死递归
【2】相互继承(不可用)
【3】继承自己类型的指针(链表使用方式)
三、方法的重写
父类和子类方法重名
采用就近原则,子类方法重写了父类方法,使用了子类中的Print
如果想使用父类的方法:
四、方法值和方法表达式
(1)方法值
这种方法隐藏了方法接受者
(2)方法表达式
显示调用方法
接口
一、接口的定义和使用
接口就是一种规则和标准
接口的定义方式 :
type 接口名 interface{
方法名()
}
二、多态的实现
多态就是函数参数为接口类型,通过传入的参数的不同类的类型,调用相应同名但是使用方式不同的方法
三、接口的继承和转换
子集和超集,超集继承了子集。父类的派生类的方法不想与其它派生类所共用
四、空接口
五、类型断言
能够获得接口的类型