面向对象三大特性
一、封装
封装主要是通过访问权限控制实现的。
java中有public,private等可以控制访问权限
go中的访问权限控制:
通过约定来实现权限控制(首字母的大小写)
二、继承
go是没有继承的,但是可以通过结构体实现继承的效果
// Person 有三个属性,两个方法
type Person struct {
IdCard string
Age int
Name string
}
func (p *Person) Eat() {
fmt.Println("我会吃")
}
func (p *Person) Run() {
fmt.Println("我会跑")
}
// student在person的基础上多了两个属性,一个方法
type Student struct {
Person
ClassName int
StudentNum int
}
func (s *Student) Exam() {
fmt.Println("我会考试")
}
func main() {
//student := Student{ClassName:3,StudentNum:11231,Person:Person{IdCard:"111"}}
student := Student{}
student.IdCard = "111xx"
student.Name = "张三"
student.Age = 18
student.ClassName = 3
student.StudentNum = 113123
student.Eat()
student.Exam()
fmt.Println(student.Name)
fmt.Println(student.IdCard )
}
// 重写
func (s *Student)Eat() {
fmt.Println("我是学生,我可以在食堂吃")
}
三、多态(polymorphic)
有多种形态,某个struct实现了某个interface中的所有方法
type Animal interface {
Say()
}
type Cat struct {
Name string
Age int
}
func (c * Cat) Say() {
fmt.Printf("%s,%d岁了,%s\n",c.Name,c.Age,"喵喵的叫")
}
type Dog struct {
Name string
Age int
}
func (d *Dog)Say() {
fmt.Printf("%s,%d岁了,%s\n",d.Name,d.Age,"汪汪的叫")
}
func AnimalSay(a Animal) {
a.Say()
}
func main() {
cat := Cat{Name:"小花",Age:1}
dog := Dog{Name:"小奶狗",Age:2}
AnimalSay(&cat)
AnimalSay(&dog)
}