【golang笔记】go_继承inheritance(14)

Page content

这一篇简单的整理了golang继承inheritance相关的内容。

1.继承的基本结构

下面的例子可以简单的说明继承的基本结构

package main
 
import (
 "fmt"
)
 
type Student struct {
 Name string
 Age int
 Score int
}
//小学生结构体
type Pupil struct {
 Student //匿名结构体
}
//大学生结构体
type Graduate struct {
 Student //匿名结构体
}
 
//显示学生成绩
func (stu *Student) ShowInfo()  {
 fmt.Println("学生名:",stu.Name,"学生年龄:",stu.Age,"学生成绩:",stu.Score)
}
//输入学生考试成绩
func (stu *Student) SetScore(score int)  {
  stu.Score = score
}
func (p *Pupil) Tesing()  {
 fmt.Println("小学生正在考试")
}
func (p *Graduate) Tesing()  {
 fmt.Println("大学生正在考试")
}
func main() {
 //调用小学生结构体
 pupil := Pupil{}
 pupil.Student.Name = "小王"
 pupil.Student.Age = 7
 pupil.Tesing()
 pupil.SetScore(66)
 pupil.ShowInfo()
 
 graduate := Graduate{}
 graduate.Name = "大王"
 graduate.Age = 20
 graduate.Tesing()
 graduate.SetScore(560)
 graduate.ShowInfo()
}

2.几个细节

  1. 结构体可以使用嵌套匿名结构体所有的字段和方法,
    即:首字母大写或者小写的字段、方法,都可以使用,仅在本包中
package main

import "fmt"

type A struct {
 Name string
 age  int
}
type B struct {
 A
}

func (a *A) SayName() {
 fmt.Println("name=", a.Name)
}
func (a *A) sayAge() {
 fmt.Println("aget=", a.age)
}
func main() {
 b := B{}
 b.Name = "老王"
 b.age = 18
 b.SayName() //name=老王
 b.sayAge()  //age=18
}
  1. 当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,
    如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。
package main

import "fmt"

type A struct {
 Name string
}
type B struct {
 A
 Name string
}

func (a *A) SayName() {
 fmt.Println("a.name=", a.Name)
}
func (b *B) SayName() {
 fmt.Println("b.name=", b.Name)
}
func main() {
 b := B{}
 b.Name = "老王"
 b.SayName()   //b.name= 老王
 b.A.SayName() //a.name= 
}
  1. 结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定置名结构体名字,否则编译报错。
package main

type A struct {
 Name string
 Age  int
}
type B struct {
 Name string
}
type C struct {
 A
 B
}

func main() {
 c := C{}
 //c.Name = "老王" //这么写会报错
 c.A.Name = "老王"
}
  1. 如果一个struct嵌套了一个有名结构体,这种模式就是组合,
    如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字
package main

import "fmt"

type A struct {
 Name string
 Age  int
}
type B struct {
 a A //有名结构体
}

func main() {
 b := B{}
 //b.Name = "老王" 这么写会编译报错
 b.a.Name = "老王"
 fmt.Println(b)
}
  1. 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值

package main
 
import "fmt"
 
type Goods struct {
 Name string
 Price float32
}
type Brand struct {
 Name string
 Address string
}
type TV struct {
 Goods
 Brand
}
type TV2 struct {
 *Goods
 *Brand
}
func main() {
 tv1 := TV{Goods{"电脑1", 4000}, Brand{"联想", "四川"},}
 fmt.Println(tv1)
 tv2 := TV{Goods{Name: "电脑2", Price: 5000}, Brand{Name: "惠普", Address:"福建"},}
 fmt.Println(tv2)
 tv3 := TV2{&Goods{"电脑1", 4000}, &Brand{"联想", "四川"},}
 fmt.Println(*tv3.Brand,*tv3.Goods)
}
  1. 其他

package main
 
import "fmt"
 
type A struct {
 Name string
 Age int
}
type B struct {
 A
 int //可以这么写一个匿名的
}
 
func main() {
 b := B{}
 b.Name = "老王"
 b.int = 10
 b.Age = 20
 fmt.Println(b) // {{老王 20} 10}
}

欢迎大家的意见和交流

email: li_mingxie@163.com