每次学习并整理一个Golang的知识点,每天进步一点点。今天学习一个go结构体嵌套的知识点🤔。

日省吾身

1.下面这段代码的输出结果?

1
2
3
4
5
func main() {  
    a := -7
    b := +7
    fmt.Printf("%+d %+d", a, b)
}
  • A. -7 +7
  • B. +7 +7
  • C. 7 7
  • D. +7 -7

2.判断下面代码是否能正常执行?如果可以,写出输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type People struct{}

func (p *People) ShowA() {
    fmt.Println("showA")
    p.ShowB()
}
func (p *People) ShowB() {
    fmt.Println("showB")
}

type Teacher struct {
    People
}

func (t *Teacher) ShowB() {
    fmt.Println("teacher showB")
}

func main() {
    t := Teacher{}
    t.ShowB()
    t.ShowA()
}

思考后看答案

思考后看下方答案…


答疑解惑

参考答案:

1. A %+d 表示带符号的整型

%d表示输出十进制数字,+表示输出数值的符号; fmt.Printf("%+d", 255)结果输出为:+255

2. 输出结果见下: 知识点:结构体嵌套

1
2
3
teacher showB
showA
showB
  • 结构体Teacher中又嵌套了另外一个结构体:People;在嵌套结构体中,People 称为内部类型,Teacher 称为外部类型;通过嵌套,内部类型的属性、方法,可以为外部类型所有,就好像是外部类型自己的一样。此外,外部类型还可以定义自己的属性和方法,当外部类型方法名与内部类型相同时,内部类型的方法就会被“屏蔽”,优先使用外部类型自己的方法。这个例子中的 ShowB() 就是同名方法,所以调用了TeacherShowB()方法,输出:teacher showB";

  • t.ShowA(),由于Teacher 没有自己的 ShowA()方法,所以调用内部类型 People 的同名方法,而People的ShowA()方法中又调用了自己的ShowB()方法,所以t.ShowA()的输出结果为:showA showB;

以上,你做对了吗?😊

其他相关答案或补充知识点,欢迎在评论区留言补充!

扩展阅读

匿名字段

结构体中的字段可以不给名称,这时称为匿名字段。匿名字段的名称强制和类型相同。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
type person struct {
	name string
	age  int
}

type teacher struct {
	person
	int
	school string
}

上面teacher中有两个匿名字段personint,匿名字段的名称和类型相同,等价于:

1
2
3
4
5
type teacher struct {
	person person
	int    int
	school string
}

跟题2类似,teacher中嵌套了其他结构体(person)。其中teacher就称为外部struct,person就称为内部struct;

下期提问

  1. 下面代码的输出结果?
1
2
3
4
5
6
7
8
9
func hello(n int) {
	fmt.Println(n)
}

func main() {
	n := 5
	defer hello(n)
	n = n + 10
}

答案及解析将在下期文章中给出,欢迎大家在评论区留言,独乐乐不如众乐乐,交流学习,互相进步


欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”或扫描下方二维码:

xujpxm_qrcode_gh