GoLang(05)

一:面向对象

[1] Golang语言面向对象编程说明:
        (1) Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。
        (2) Golang没有类(class), Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。
        (3) Golang面向对象编程非常简洁,去掉了传统OOP语言的方法重载、构造函数和析构函数、隐藏的this指针等等
        (4) Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现。
[2]结构体的定义:

        结构体的定义使用关键字 struct,可以包含多个字段(成员),每个字段都有名称和类型。

type 结构体名 struct{
//注意字段名大写,外界可以访问这个属性
    字段名 字段类型
    字段名 字段类型
    字段名 字段类型
    ......
}

[3]结构体之间的转换

        结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字个数和类型)
       结构体进行type重新定义(相当于取别名), Golang认为是新的数据类型,但是相互间可以强转
[4]方法:

        方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct
        方法的声明和调用格式:

func (接收者变量 接收者类型) 方法名(参数列表) 返回值类型 {
    // 方法体
}
//接收者类型---结构体

注:

        (1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
        (2)如程序员希望在方法中,力改结构体变量的值,可以通过结构体指针的方式来处理

                底层是指针,底层编译器做了优化,底层会自动帮我们加上& *
        (3) Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct, 比如int ,float32等都可以有方法

        (4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。
        (5)如果一个类型实现了String()这个方法,那么fmt. Println默认会调用这个变量的String()进行输出

[6]函数和方法的区别

(1)绑定指定类型:
        方法:需要绑定指定数据类型
        函数:不需要绑定数据类型
(2)调用方式不一样:
        函数的调用方式:
        函数名(实参列表)
        方法的调用方式:变量.方法名(实参列表)
(3)对于函数来说,参数类型对应是什么就要传入什么。
(4)对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。
[7]封装

  [1]什么是封装:
        封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作方法,才能对字段进行操作。
[2]封装的好处:
        (1)隐藏实现细节
        (2)提可以对数据进行验证,保证安全合理
[3] Golang中如何实现封装:
        (1)建议将结构体、字段(属性)的首字母小写(其它包不能使用,类似private, 实际开发不小写也可能,因为封装没有那么严格)
        (2)给结构体所在包提供一个工厂 模式的函数,首字母大写(类似一个构造函数)
        (3)提供一个首字母大写的se妨法(类似其它语言的public), 用于对属性判断并赋值
                func (var结构体类型名)SetXx(参数列表){
                        //加入数据验证的业务逻辑
                        var.Age =参数
                }
(4)提供一个首字母大写的Get方法(类似其它语言的public), 用于获取属性的值
                func (var结构体类型名) GetXxx( (返回值列表){
                return var.字段;

                }

[8]继承

[1]继承:
        当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法,其它的结构体不需要重新定义这些属性和方法,只需嵌套一个匿名结构体即可。 也就是说:在Golang中, 如果一个struct嵌套 了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。
[2]继承的优点:
提高代码的复用性、扩展性

[3]注:

       (1)结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。
       (2)匿名结构体字段访问可以简化。
       (3) 当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访间原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。

      (4) Golang中支持多继承:如一个结构体嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。为了保证代码的简洁性,建议大家尽量不使用多重继承,很多语言就将多重继承去除了,但是Go中保留了。
      (5) 如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分.
      (6) 结构体的匿名字段是基本数据类型。

      (7) 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。
      (8) 嵌入匿名结构体的指针也是可以的。
      (9) 结构体的字段可以是结构体类型的。(组合模式)

[9]接口

[1]接口:
        (1)接口中可以定义一组方法,但不需要实现,不需要方法体。并且接口中不能包含任何变量。到某个自定义类型要使用的时候(实现接口的时候) ,再根据具体情况把这些方法具体实现出来。
        (2)实现接口要实现所有的方法才是实现。
        (3) Golang中的接,不需要显式的实现接口。Golang中没有implement关键字。
        (Golang中实现接口是基于方法的,不是基于接口的)
        例如:
        A接口a,b方法
        B接口a,b方法
        C结构体实现了a,b方法 ,那么C实现了A接口,也可以说实现了B接口(只要实现全部方法即可, 和实际接口耦合性很低,比Java松散得多)
        (4)接口目的是为了定义规范,具体由别人来实现即可。
[2]注:

        (1)接口本身不能创建实例,但是可以指向一一个实现了该接口的自定义类型的变量。
        (1)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。
        (1)一个自定义类型可以实现多个接口
        (1)一个接口(此如A接口)可以继承多个别的接口(比如B,c接口),这时如果要实现A接口,也必须将B,c接口的方法也全部实现。
        (1) interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil
        (1)空接口没有任何方法,所以可以理解为所有类型都实现了空接口,也可以理解为我们可以把如何一个变量赋给空接口。

[10]多态

[1]基本介绍
        变量(实例)具有多种形态。面向对象的第三大特征,在Go语言,多态特征是通过接口实现的。可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。
[2]接口体现多态特征
        1)多态参数
        2)多态数组
 

[11]断言

[1]什么是断言?
        Go语言里面有一个语法,可以直接判断是否是该类型的变量: 变量的值, ok = interface变量.(断言的类型),ok是一 个bool类型。
[2] Type Switch的基本用法
        Type Switch是Go语言中一种特殊的switch语句,它比较的是类型而不是具体的值。它判断某个接口变量的类型,然后根据具体类型再做相应处理。
 





       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值