Go基础08 面向对象的基本概念

2017-08-23 15:11:22

Go里没有class关键字,通过使用struct和interface实现面向对象的思想.
在传统的面向对象语言中,class是基本单位,是数据成员和当前定义的所有操作,并对外提供公共方法让使用者操作对象.而且必须一开始就定义好了那些操作,不能开放式扩展.

  • 结构体
    如果要某个符号对其它包访问,需要将该符合定义为以大写字母开头

    1
    2
    3
    4
    5
    type Human struct {
    name string
    age int
    Height float64
    }

    一个Golang对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //定义一个Human类包含name和age
    type Human struct {
    name string
    age int
    }

    //定义一个Men接口
    type Men interface {
    Say()
    }

    //带接收参数的函数称为method
    func (h Human) Say() {
    fmt.Println("hello %s", h.name)
    }
  • 组合
    Golang里没有继承,是通过匿名组合来实现,没有传统的继承关系链,同时还能重用父类的方法和成员
    来看下面的例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    type Base struct {

    }

    func (b Base)show() {
    println("hello ws")
    }

    type Child struct {
    Base
    }

    func main() {
    child := Child{}
    child.Show()
    }
  • 接口
    Go语言中的接口是一系列操作定义的集合,不允许进行实现,而且也不能定义变量或者常量,这种非侵入式的设计,是为了解耦。接口和类本是不同的东西:类是把数据和代码包装在一起,是为了对内实现,接口则像是一种契约,是为了对外展示,Go语言中如果某个对象实现了这个接口的所有方法,那么就可以说这个对象实现了这个接口

    1
    2
    3
    4
    5
    type Interface interface {
    Len() int
    Less(i, j int) bool
    Swap(i, j int)
    }

    空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。空interface对于描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值

    1
    2
    3
    4
    5
    var a interface{} //define a null interface
    var i int = 5
    s := "Hello world"
    a = int // a 可以存储任意类型的数值
    a = s

    一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也就可以返回任意类型的值

  • 总结
    struct是变量的集合
    interface是方法的集合
    struct与interface都支持匿名字段, 换言之, 支持组合实现继承
    golang的struct与C++的class一样, 只能声明变量, 不能初始化


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。