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