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
}

 

posted on 2020-11-18 23:39  孤灯引路人  阅读(124)  评论(0编辑  收藏  举报

导航