【Go语言】继承

63 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

继承的实现分析

1. 结构:

type 结构体名 struct{

字段名 字段类型

字段名 字段类型

嵌套结构体名

}

结构分解: img

解析:golang本质上没有oop的概念,也没有继承的概念,但是可以通过结构体嵌套实现这个特性。继承的实质是结构体的嵌套。例如B继承A, 即在B结构体中 声明 A匿名结构体。结构体可以使用嵌套匿名结构体的所有字段加方法(即:同一个包中,首字母大写和小写的字段、方法,都可以使用)。

2. 举例:有一个名为小明的同学,在某单位就职。请输出小明的相关信息并输出:

 type company struct {                                        //结构体声明
    Name string
    Addr string
 }
 type staff struct {
    name     string
    age      int
    gender   string
    position string
    company
 }
 func main() {                                                     //主函数
    myCom := company{                                         //字段赋值
       "知链科技",
       "北京",
    }
    staffInfo := staff{
       "小明",
       12,
       "男",
       "研发工程师",
       myCom,
    }
   fmt.Printf("%s 在 %s 工作\n", staffInfo.name, staffInfo.Name)    //语句&表达式输出
   fmt.Printf("%s 在 %s 工作\n", staffInfo.name, staffInfo.company.Name)
 }

终端输出:img

结构解析:

 type company struct {                                      //结构体声明
    Name string
    Addr string
 }
 type staff struct {
    name     string
    age      int
    gender   string
    position string
    company
 }

结构体声明: 在Go语言中提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct 。结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。且Go语言中一般通过结构体(struct)来实现面向对象。,另外结构体通过关键字type来命名标识符再通过明确字段名的的数据类型来完成结构体的成员完整声明过程。

 func main() {                                                     //主函数
 }

主函数: func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。

  myCom := company{                                         //字段赋值
       "知链科技",
       "北京",
    }
    staffInfo := staff{
       "小明",
       12,
       "男",
       "研发工程师",
       myCom,
    }

字段赋值: 在Go语言中给结构体赋值,在简化赋值的过程中直接使用:=(推导类型声明法)进行赋值,编译器能根据右值类型进行自主判断数据类型。需要注意的是,字段的赋值要依次按照声明结构体时的字段类型去依次赋值。

 fmt.Printf("%s 在 %s 工作\n", staffInfo.name, staffInfo.Name)    //语句&表达式输出
 fmt.Printf("%s 在 %s 工作\n", staffInfo.name, staffInfo.company.Name)

语句&表达式输出:* 函数内语句依照函数内的编译顺序依次执行。输出语句在调用函数方法后获取到输出结果进行打印。格式化输出一般指规格化浮点数。 规格化浮点数又称格式化输出,是指把一个浮点数按指定的格式进行转换。常用的格式化函数有:format,cast等。其格式化样式是字符串形式,格式化动词以%开头,而参数列表以逗号分隔多个参数,参数要与格式化样式中格式化动词一一对应,防止运行时报错。在该输出中Printf 函数支持格式化输出字符串,输出内容前端加上对应的占位符就能输出相应的格式化字符串内容。*

继承匿名结构体分析

1. 结构:

type 结构体名 struct{

匿名结构体1

匿名结构体2

}

结构分解:img

解析:在go语言中,其中的结构体除了继承一般的结构体外,还可以嵌套匿名结构体,并且结构体可以使用嵌套匿名结构体所有的字段和方法(首字母大写或者小写的字段、方法,都可以使用)。但是需要注意的是当结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。

2. 举例:请写一个简单的程序,输出两类电视机型的简单信息。

 type Goods struct {                                               //结构体声明
    Name  string
    Price float64
 }
 type Brand struct {
    Name    string
    Address string
 }
 //  匿名结构体
 type TV struct {
    Goods
    Brand
 }
 func main() {                                                       //主函数
    tv := TV{Goods{"电视机001", 5000.99}, Brand{"海尔", "山东"}}       //结构体赋值
    tv2 := TV{
       Goods{
          Price: 5000.99,
          Name:  "电视机002",
       },
       Brand{
          Name:    "夏普",
          Address: "北京",
       },
    }
    fmt.Println(tv)                                             //语句&表达式输出
    fmt.Println(tv2)
 }

终端输出:img

结构解析:

 type Goods struct {                                               //结构体声明
    Name  string
    Price float64
 }
 type Brand struct {
    Name    string
    Address string
 }
 //  匿名结构体
 type TV struct {
    Goods
    Brand
 }

结构体声明: 在Go语言中提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct 。结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。且Go语言中一般通过结构体(struct)来实现面向对象。,另外结构体通过关键字type来命名标识符再通过明确字段名的的数据类型来完成结构体的成员完整声明过程。需要注意的是当声明匿名结构体后访问前一定要指顶匿名结构体名字,否则编译器就会报错。

 func main() {                                                       //主函数
   }

主函数: func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。

tv := TV{Goods{"电视机001", 5000.99}, Brand{"海尔", "山东"}}       //结构体赋值
   tv2 := TV{
      Goods{
         Price: 5000.99,
         Name:  "电视机002",
      },
      Brand{
         Name:    "夏普",
         Address: "北京",
      },
   }

结构体赋值: 在Go语言中给结构体赋值,在简化赋值的过程中直接使用:=(推导类型声明法)进行赋值,编译器能根据右值类型进行自主判断数据类型。需要注意的是,字段的赋值要依次按照声明结构体时的字段类型去依次赋值。

fmt.Println(tv)                                             //语句&表达式输出
fmt.Println(tv2)

语句&表达式输出: fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照函数内的编译顺序依次执行。输出语句在调用函数方法后获取到输出结果进行打印。

继承匿名字段分析

继承匿名字段分析

1. 结构:

type 结构体名 struct{

字段类型1

字段类型2

}

释义:当结构体中的字段没有明确的名字,只包含一个没有字段名的类型时,是可以将声明的类型默认为该类型的字段名的,且需要注意的是同一个类型只能写一个,局限性比较强。结构体嵌套中采用的匿名结构体字段可以模拟继承关系。

结构分解:img

2.举例:

 type cat struct {                                                    //结构体声明
    string
    int8
    byte
 }
 ​
 func main() {                                                          //主函数
    cat1 := cat{"Tom", 5, 1}
    fmt.Println(cat1)
    //分别输出
    fmt.Printf("宠物名:%v , 宠物年龄:%v ,宠物性别:%v \n", cat1.string, cat1.int8, cat1.byte)
 }

终端输出: img

细节分析:

  type cat struct {                                                    //结构体声明
    string
    int8
    byte
 }

匿名字段的声明: Go* 语言中一般通过结构体(struct)来实现面向对象。,另外结构体通过关键字type来命名标识符再通过明确字段名的的数据类型来完成结构体的成员完整声明过程。但需要注意的是与声明匿名结构体不同的是,声明匿名字段时只需要声明字段类型即可,但该匿名字段只能有一个,例如该结构体中有 int 类型的匿名字段,就不能第二个。如果必须要存在多个int类型字段则必须要指定int类型的名称。*

 func main() {                                                          //主函数
    cat1 := cat{"Tom", 5, 1}
    fmt.Println(cat1)
    //分别输出
    fmt.Printf("宠物名:%v , 宠物年龄:%v ,宠物性别:%v \n", cat1.string, cat1.int8, cat1.byte)
 }

主函数: func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。该主函数中先给结构体进行了赋值,并在简化赋值的过程中直接使用:=(推导类型声明法)进行赋值,并在赋值后通过.Println(...)函数输出语句将函数结果依次打印了出来。