面向对象编程OOP
一 Go语言OOP
但面向对象的思想凌驾于任何具体的技术之上,虽说go并不是一个纯面向对象的编程语言,但仍可以实现OOP
- 1、结构体即”类”
- 2、方法即绑定方法
- 3、定义方法New()或NewT()代替构造函数
例
package main
import (
"fmt"
)
// 类
type Person struct {
name string
gender string
age int
}
// 构造函数
func NewPerson(name string, gender string, age int) *Person {
return &Person{
name: name,
gender: gender,
age: age,
}
}
// 绑定方法
func (p *Person) tell() {
fmt.Printf("%v:%v:%v\n", p.name, p.gender, p.age)
}
func main() {
p1 := NewPerson("egon", "male", 18)
p1.tell() // egon:male:18
}
二 结构体的“继承“与“派生”
基于结构体嵌套的思想,Go语言中的结构体也可以实现其他编程语言中面向对象的继承。
// ==================”父类“:Person==================
type Person struct {
name string
gender string
age int
}
func (p *Person) tell() {
fmt.Printf("%v:%v:%v\n", p.name, p.gender, p.age)
}
func (p *Person) setAge(age int) {
p.age = age
}
// ==================”子类“:Teacher==================
type Teacher struct {
*Person // 嵌套结构体指针,此处可声明为匿名字段
level int
}
// 派生:可以在子类产生的新方法中重用父类的功能
func (t Teacher) tell() {
fmt.Printf("%v:", t.level)
t.Person.tell() // 调用t.tell()则冲突了
}
// ==================使用==================
func main() {
t1 := Teacher{
&Person{
"egon",
"male",
18,
},
10,
}
t1.setAge(20)
t1.Person.tell() // egon:male:20
t1.tell() // 10:egon:male:20
}
method是可以继承的