Golang结构体及面向对象思想
面向对象:
面向对象:不是一门语言,也不是一门技术,是一种编程思路,把每一步封装成函数,然后调用。
面向过程:只关心过程、步骤,只关注实现的过程,像一个计划表
思考方式:
- 考虑问题中有哪些对象(类)?
- 这些对象是啥?属性————>字段,行为————>方法(函数)
- 对象和对象的关系(类和类的关系)?是否包含?是否聚合?
类
类:同一类事物的抽象描述,类中包含两种:
- 静态属性:就是描述性字段
- 动态属性:方法,即函数
对象
对象:类中的一个具体的实例,使用类创建出来的就是对象
类和对象关系
- 类是对象的抽象描述,对象是类的一个具体实例
- 将一类对象的共同特征,进行抽取————>定义类
抽象出: class —->struct{
属性:字段,变量
行为:方法,函数
} - 将类进行实例化————>创建对象
通过struct创建对象,p1:=Person{}
对象名.属性
对象名.方法名()
直接调用的是函数
通过对象调用的是方法
面向对象三大特征
1. 封装性
"打包",函数,方法,结构体,对外留个口,不关系你里面是细节,只需要调用即可,不关心内部的逻辑细节
2. 继承性
描述一个类和另一个类的关系
子类继承父类:
子类可以直接访问父类的属性和方法
子类可以新增自己的属性和方法
子类可以重写父类的方法
靠结构体的嵌套:
匿名结构体字段:提升字段(子类里爹的字段,就是提升字段)
3. 多态性:接口,一类事物的多种形态
结构体
定义语法
type 结构体名 struct{
字段名 字段类型
}
创建对象
- 对象名:=结构体名{val1,val2,val3}
- 对象名:=结构体名{字段名:val1,字段名:val2}
- 对象名:=结构体名{}
对象名.字段名,进行赋值和取值 - 对象名:=new(Type) //创建一个指针
结构体参数类型
func fun1(P Person){ } //拷贝数值,默认传递是值类型传递
func fun2(p *Person){ } //指针地址传递
深浅拷贝
- 深拷贝:就是将值复制一份,改变此处的值不影响原来的值
- 浅拷贝:将地址赋值个另一个变量,当一处对此地址进行改变时,远来的变量的值也变换了
匿名结构体和匿名字段
没有名字的结构体
a:=struct{字段的定义}{赋值}
func (){}()
匿名字段
type A struct{
string
int
}
b:=A{"字符串",23}
b.string,b.int
匿名字段可以理解为字段名和字段类型一致
类和类的关系:(结构体嵌套)
1、聚合关系(has a ):讲一个类作为另一个类的属性字段
2、继承性(is a ):(嵌套)描述两个类的关系,一个类作为另一个类的子类,子类可以使用父类的功能
继承的意义:
1. 避免重复代码(子类)
2. 扩展类的功能(父类)
子类 is a 父类(能说的通就可以使用继承)
go语言没有真正的继承,靠两个结构体的嵌套模拟
程序设计
通过面向对象的思维方式设计程序三步走:
1. 创建struct结构体
2. 设计结构体的功能方法
3. 创建结构体对象
代码示例(聚合、继承)
package main
import (
"fmt"
)
type A struct {
name string
age int
}
type B struct {
a A //模拟聚合
}
type C struct {
A //模拟继承 有提升字段
}
func main() {
//b:=B{}
b := B{A{"Jack", 20}} //多层嵌套结构体初始化
fmt.Println(b.a.name, b.a.age) //输出Jack 20
c := C{A{"Bob", 18}}
//匿名提升字段可以通过结构体的名字进行访问
fmt.Println(c.A.name, c.A.age) //输出Bob 18
//匿名提升字段也可以直接访问其字段
fmt.Println(c.name, c.age)
}
网友评论