go学习 --- 继承

本文详细探讨了Go语言中结构体的继承特性,包括匿名结构体的使用,字段和方法的访问规则,以及如何在结构体嵌套中处理同名字段和方法。通过示例代码展示了如何创建和访问嵌套匿名结构体的实例,以及结构体组合的情况。此外,还提供了一些实际的编程练习,帮助理解Go语言中的继承细节。
摘要由CSDN通过智能技术生成

一、继承

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()

}


 二、继承细节

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

package main

import "fmt"

type A struct {
	Name string
	age int
}
type B struct {
	A
}
func (a *A) Say()  {
	fmt.Println(a.Name)
}
func (a *A) say()  {
	fmt.Println(a.age)
}
func main() {
	b := B{}
	b.Name = "老王"
	b.age = 18
	b.Say()
	b.say()
}

 2、当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。

package main

import "fmt"

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

func (a *A) Say()  {
	fmt.Println("a",a.Name)
}
func (b *B) Say()  {
	fmt.Println("b",b.Name)
}
func main() {
	b := B{}
	b.Name = "老王"
	b.Say()
	b.A.Say()
}

 3、结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定置名结构体名字,否则编译报错。

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 = "老王" //ambiguous selector c.Name 必须指明要使用的Name
	c.A.Name = "老王"
}

4、如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字

package main

import "fmt"

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


func main() {
	b := B{}
	b.a.Name = "老王"
	fmt.Println(b)
}

 5、嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值

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)

}

 三、练习一

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)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭鸭老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值