面向对象编程OOP
一 Go语言OOP
但面向对象的思想凌驾于任何具体的技术之上,虽说go并不是一个纯面向对象的编程语言,但仍可以实现OOP
- 1、结构体即”类”
- 2、方法即绑定方法
- 3、定义方法New()或NewT()代替构造函数
例
二 结构体的“继承“与“派生”
基于结构体嵌套的思想,Go语言中的结构体也可以实现其他编程语言中面向对象的继承。
method是可以继承的
但面向对象的思想凌驾于任何具体的技术之上,虽说go并不是一个纯面向对象的编程语言,但仍可以实现OOP
例
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是可以继承的