转自:https://zhuanlan.zhihu.com/p/94625212
面向对象的三大基本特征:
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
继承:使得子类具有父类的属性和方法或者重新定义、追加属性和方法等
多态:不同对象中同种行为的不同实现方式
在 Go 语言中没有 public、private、protected 这样的访问控制修饰符,它是通过字母大小写来控制可见性的。
如果定义的常量、变量、类型、接口、结构、函数等的名称是大写字母开头,这表示它们能被其它包访问或调用(相当于 public);非大写开头就只能在包内使用(相当于 private)。
1、封装
Person.go
在person文件夹中
package person
type Person struct{
name string //两个成员变量都是非大写字母开头,只能在包内使用
age int
}
func (p *Person)GetName()string{
return p.name
}
func (p*Person)SetName(name string){
p.name = name
}
func (p *Person)GetAge()int{
return p.age
}
func (p*Person)SetAge(age int){
p.age = age
}
main.go
package main
import (
"./person"
"fmt"
"strconv"
)
// 1、封装
func main(){
p := new(person.Person)
p.SetName("广大菜鸟")
p.SetAge(21)
fmt.Println(p.GetName()+" "+strconv.Itoa(p.GetAge()))
}
2、继承和多态
在 Go 语言中没有 extends 关键字,它使用在结构体中内嵌匿名类型的方法来实现继承。
匿名类型:即这些类型没有显式的名字。
package main
import "fmt"
type Person interface{
speak()
sleep()
}
//继承
type Teacher struct{
Person
}
type Student struct{
Person
}
// 多态部分:
func (t*Teacher)speak(){
fmt.Println("hello ,world")
}
func (s * Student)speak(){
fmt.Println("你好,世界")
}
func main(){
t := new(Teacher)
t.speak() //hello ,world
new(Student).speak() //你好,世界
}
总结
面向对象的三大特征是:封装、继承和多态
Go 语言使用结构体对属性进行封装,结构体就像是类的一种简化形式
在 Go 语言中,方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量
名称首字母的大小写决定了该变量/常量/类型/接口/结构/函数……能否被外部包导入
无法被导入的字段可以使用 getter 和 setter 的方式来访问
Go 语言使用在结构体中内嵌匿名类型的方法来实现继承
使用接口可以实现多态