<aside> 💡 面向对象的特性跟java的特性是一样的,比如封装、继承、多态。需要注意的是go的继承是用嵌入匿名结构体、接口没有像java一样的implement关键字,而是在接口中定义了方法,任何一个类型实现了所有的方法,就表示这个接口被实现了,多态的概念和java差不多。

</aside>

封装

Golang区分公有属性和私有属性的机制就是方法或属性是否首字母大写,如果首字母大写的方法就是公有的,如果首字母小写的话就是私有的。

package main

import "fmt"

type Person struct {
    name string
}

func (person *Person) setName(name string) {
    person.name = name
}

func (person *Person) GetInfo() {
    fmt.Println(person.name)
}

func main() {
    p := Person{"zhangsan"}
    p.setName("lisi")
    p.GetInfo()
}

go中不强调封装的必要性。

继承

解决代码复用性问题,GO语言的继承方式采用的是匿名组合的方式:Woman 结构体中包含匿名字段Person,那么Person中的属性也就属于Woman对象。

<aside> 💡 所有的内置类型和自定义类型都是可以作为匿名字段去使用,java中,因为final类不可不继承,很多内置类都被定义为final

</aside>

<aside> 💡 多重继承是嵌入多个匿名类,当然会破坏继承的完整,不太建议使用

</aside>

同名字段的情况

指针类型匿名字段

package main

import "fmt"

//人
type Person struct {
    name string
    sex  string
    age  int
}

// 学生
type Student struct {
    *Person
    id   int
    addr string
}

func main() {
    s1 := Student{&Person{"5lmh", "man", 18}, 1, "bj"}
    fmt.Println(s1)
    fmt.Println(s1.name)
    fmt.Println(s1.Person.name)
}