go里面面向对象
基础知识
因为方法和结构体是在一起使用的所以首先定义结构体
type Student struct { Name string Age int }
定义结构体对应方法通过参数绑定调用的结构体
func (persion Persion) Learing() {
}
#备注:persion Persion适合方法在一起使用的所以和结构体关联如上面使用如图例:
p1:= Persions{"lisi",20}; fmt.Println(p1.Name);
完整代码如下
package main import "fmt" type Persions struct { Name string Age int } func (persion Persion) Learing() { } func main() { p1:= Persions{"lisi",20}; fmt.Println(p1.Name); }
重要:因为结构体是值传递,所以如果方法里面修改数据,在外面获取不到
继承
通过讲目标 匿名引入结构体可实现继承
package main import "fmt" type Persion struct { Name string Age int } type Student struct { Persion //写入结构体继承 } func ( p * Persion) Add(name string, age int){ p.Name = name p.Age=age } func (p * Persion) Show() { fmt.Println(p.Name,p.Age) } func (s * Student)Learn(){ fmt.Println(s.Name,"学习") } func main(){ s1:=Student{} s1.Add("lisi",20) s1.Learn() }
封装
在go语言的结构体中,大写字母开头的属性是包外可用的,小写字母开头的属性是只有包内可用的。相比java,没有protected的概念。java的私有变量,大部分情况还需要写getter、setter方法去暴露出来,这其实造成了很多的代码冗余,其实大可不必。
接口和多态
package main import "fmt" type Aninmal interface { Eat(food string) Run() } type Dog struct {} func (d Dog) Eat(food string){ fmt.Println("dog eat"+food) } func (d Dog) Run(){ fmt.Println("is run") } type Cat struct {} func (c Cat)Eat(food string){ fmt.Println("cat eat "+ food) } func (c Cat) Run(){ fmt.Println("is runding") } func main(){ var animal Aninmal animal = Dog{} animal.Eat("吃肉") animal.Run() animal= Cat{} animal.Eat("虫子") animal.Run() }
go如何多继承?
在java中,一个对象只能继承自一个类,但是可以实现多个接口。
在go中可以通过引入多个匿名结构体以实现多继承,至于实现多个接口,只需要把这些接口的方法都实现即可。
下例分别实现了多继承和实现多个接口,鸟实现了飞和叫的接口。鸭子继承了鸟和卵生动物。因此鸭子也拥有了飞、叫、下蛋的行为
package main import "fmt" type Flyer interface { Fly() } type Speaker interface { Speak() } type Bird struct { } func (b Bird) Fly() { fmt.Println("飞啊飞...") } func (b Bird) Speak() { fmt.Println("鸟叫") } // Waterfowl 水禽 type Waterfowl interface { // Swim 水禽都会游泳 Swim() } // Oviparous 卵生动物 type Oviparous struct { } func (o Oviparous) LayEggs() { fmt.Println("下蛋了") } // Duck 鸭子继承了鸟和卵生动物 type Duck struct { Bird Oviparous } func main(){ du:=Duck{} du.Fly() }
重载
go允许覆盖匿名结构体的方法以实现重载,例如上例中,鸭子的叫声应该是“嘎嘎嘎”:
func (d Duck) Speak() { fmt.Println("鸭子叫:嘎嘎嘎") }
接口嵌套
嵌套得到的接口的使用与普通接口一样,只要实现包含的所有方法即可实现接口。
// Sayer 接口 type Sayer interface { say() } // Mover 接口 type Mover interface { move() } // Human 接口嵌套 type Human interface { Sayer Mover }