面向对象
概念
一个很形象的图
-
匿名组合
一个结构引用另一个结构体的成员,继承全部
- 匿名字段的初始化
- 顺序初始化
- 自动推导型
- %+v :显示更加详细,继承自哪里都显示出来
- 指定成员初始化
- 指定匿名字段的值
- 注意
匿名字段的使用,不能直接顺序指定值 S5:=Student{"yy",'m',18....}
这样子是无法编译的
- 成员的操作
- 指定匿名字段的值
类似于py,直接变量.成员名,就可以对其进行取值及赋值
- 同名字段处理
- 当两个结构体中有同名字段,进行赋值时,遵循就近原则,作用域的选择
可以看到匿名字段中的name为空,主结构体中的name被赋值
如果要指定匿名结构体中的成员,就要进行显示指定
- 非结构体匿名字段
- 结构体指针类型
声明跟取地址,拿到的是一串内存地址,
当单个拿出来之后
也可以使用new进行声明
-
方法
接受者可以使用指针类型,但是接受者的本类型不能是指针类型。
原来的面向过程型
面向对象型
tmp就是原先的a,后面的other就是原来的b
调用
为结构体类型添加方法
- 指针类型
通过接口函数给其赋值
-
值语义和引用语义
- 值语义
传入的是值
可以看到,s1的地址在声明初和调用函数时地址是不一样的,函数调用的那部分相当于是s1的一个拷贝。
而且传入值改变内部成员,只能在函数内部生效,在函数外还是没有改变
%p 打印地址 - 引用语义
可以看到两个变量的地址是一样的,传递的是指针,(地址),变量经过函数调用之后也改变了
- 值语义
-
方法集
还可以这样,编译器内部自动转换
普通调用方式,也可以调用指针。
-
方法的继承
-
方法的重写
新的机构体实现了一个与原结构函数名相同的函数,在新结构体调用该函数时,就会就近使用本身实现的同名函数,如果要使用原结构体的函数,就可以显式的调用,新结构以变量名.原结构体名称.函数名()
-
方法值
与传统调用相比,就是把 结构体变量名.函数名() 变成 结构体变量名.函数名,用一个变量来保存,这个变量就是方法值,保存的是未调用的方法。 要真正调用时采用方法值()进行调用。
-
方法表达式
方法表达式跟方法值相比,省去了声明变量,直接在表达式使用结构体。在调用时再传入变量
-
接口
定义
调用
接口的继承
- 接口转换
- 子集转不了超集,会提示如下报错
- 超集可以转子集
空接口
类型判断
使用if来判断
当类型是结构体时,value返回的就是整个结构体对象,结构体内的成员可以使用value.成员名打印出来
使用switch来判断
switch声明一个变量来接受值.type()