Go区块链研习社

Golang学习笔记之3:结构体、面向对象思想

2018-05-03  本文已影响3257人  ccup区块链

Golang结构体及面向对象思想

面向对象:

面向对象:不是一门语言,也不是一门技术,是一种编程思路,把每一步封装成函数,然后调用。

面向过程:只关心过程、步骤,只关注实现的过程,像一个计划表

思考方式:

  1. 考虑问题中有哪些对象(类)?
  2. 这些对象是啥?属性————>字段,行为————>方法(函数)
  3. 对象和对象的关系(类和类的关系)?是否包含?是否聚合?

类:同一类事物的抽象描述,类中包含两种:

  1. 静态属性:就是描述性字段
  2. 动态属性:方法,即函数

对象

对象:类中的一个具体的实例,使用类创建出来的就是对象

类和对象关系

  1. 类是对象的抽象描述,对象是类的一个具体实例
  2. 将一类对象的共同特征,进行抽取————>定义类
    抽象出: class —->struct{
    属性:字段,变量
    行为:方法,函数
    }
  3. 将类进行实例化————>创建对象
    通过struct创建对象,p1:=Person{}
    对象名.属性
    对象名.方法名()
    直接调用的是函数
    通过对象调用的是方法

面向对象三大特征

1. 封装性
        "打包",函数,方法,结构体,对外留个口,不关系你里面是细节,只需要调用即可,不关心内部的逻辑细节
2. 继承性
        描述一个类和另一个类的关系
        
        子类继承父类:
        子类可以直接访问父类的属性和方法
        子类可以新增自己的属性和方法
        子类可以重写父类的方法
        
        靠结构体的嵌套:
        匿名结构体字段:提升字段(子类里爹的字段,就是提升字段)
        
3. 多态性:接口,一类事物的多种形态

结构体

定义语法

type 结构体名  struct{
                字段名   字段类型
            }

创建对象

  1. 对象名:=结构体名{val1,val2,val3}
  2. 对象名:=结构体名{字段名:val1,字段名:val2}
  3. 对象名:=结构体名{}
    对象名.字段名,进行赋值和取值
  4. 对象名:=new(Type) //创建一个指针

结构体参数类型

func fun1(P Person){ } //拷贝数值,默认传递是值类型传递
func fun2(p *Person){ } //指针地址传递

深浅拷贝

  1. 深拷贝:就是将值复制一份,改变此处的值不影响原来的值
  2. 浅拷贝:将地址赋值个另一个变量,当一处对此地址进行改变时,远来的变量的值也变换了

匿名结构体和匿名字段

没有名字的结构体
            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)
}

上一篇 下一篇

猜你喜欢

热点阅读