结构体(struct)实现继承

  在Go语言里没有类的概念,自然也没有继承的概念,所以确切的说法应该是结构体实现组合,而不是实现继承(PS:为了方便理解下面会使用继承的字眼,但请注意这实际上是组合)。

package main

import "fmt"

// Human 定义一个名为Human的结构体
type Human struct {
   Name   string // 姓名
   Age    int    // 年龄
   Gender string // 性别
}

// Programmer 定义一个名为Programmer的结构体,该结构体将继承Human结构体
type Programmer struct {
   Human             // 继承Human结构体【🐵:没错,就是辣麼简单粗暴~~~】
   Language  string  // 所使用的编程语言
   WorkYears float64 // 工作年限
}

// Intro Human结构体的自我介绍方法
func (h *Human) Intro() {
   fmt.Printf("俺叫%v%v),今年%v岁。\n", (*h).Name, (*h).Gender, (*h).Age)
}

// Intro Programmer结构体的自我介绍方法(重要说明:因为Programmer继承了Human,故该方法会覆盖Human的同名方法)
func (p *Programmer) Intro() {
   fmt.Printf(
      "俺叫%v%v),今年%v岁,职业是%v程序猿,工作年限%v年。\n",
      (*p).Name, (*p).Gender, (*p).Age, (*p).Language, (*p).WorkYears,
   )
}

func main() {
   programmer := new(Programmer)

   (*programmer).Name = "张三"
   (*programmer).Age = 18
   (*programmer).Gender = "男"
   (*programmer).Language = "PHP"
   (*programmer).WorkYears = 3.14

   // 调用自身Intro()方法
   (*programmer).Intro() // 俺叫张三(男),今年18岁,职业是PHP程序猿,工作年限3.14年。

   // 调用父类Intro()方法
   (*programmer).Human.Intro() // 俺叫张三(男),今年18岁。
}



  在很多地方我们可以看到“package.struct”写法的继承,这并没有什么特殊的,只是由于跨包继承需要指定包名而已,跟同包继承没有本质不同。

package main

import (
   "fmt"
   "time"
)

type MyTime struct {
   time.Time // 继承标准库里的time包的Time结构体
}

func (mt *MyTime) Location() string {
   return "Asia/Shanghai"
}

func main() {
   mt := &MyTime{}

   // 调用自身的Location()方法
   fmt.Printf("mt.Location() is %+v \n", mt.Location()) // mt.Location() is Asia/Shanghai

   // 调用父类的Location()方法
   fmt.Printf("mt.Time.Location() is %+v \n", mt.Time.Location()) // mt.Time.Location() is UTC
}

Copyright © 2024 码农人生. All Rights Reserved