美文网首页Go区块链研习社
Golang学习笔记之3:结构体、面向对象思想

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

作者: ccup区块链 | 来源:发表于2018-05-03 13:59 被阅读3257次

    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)
    }
    
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/nhwkrftx.html