每次学习并整理一个Golang的知识点,每天进步一点点。今天学习一个go结构体嵌套的知识点。
日省吾身
1.下面这段代码的输出结果?
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.判断下面代码是否能正常执行?如果可以,写出输出结果?
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. 输出结果见下: 知识点:结构体嵌套
teacher showBshowAshowB
- 结构体Teacher中又嵌套了另外一个结构体:People;在嵌套结构体中,People 称为内部类型,Teacher 称为外部类型;通过嵌套,内部类型的属性、方法,可以为外部类型所有,就好像是外部类型自己的一样。此外,外部类型还可以定义自己的属性和方法,当外部类型方法名与内部类型相同时,内部类型的方法就会被“屏蔽”,优先使用外部类型自己的方法。这个例子中的 ShowB() 就是同名方法,所以调用了Teacher的ShowB()方法,输出"teacher showB”;
- t.ShowA(),由于Teacher 没有自己的 ShowA()方法,所以调用内部类型 People 的同名方法,而People的ShowA()方法中又调用了自己的ShowB()方法,所以t.ShowA()的输出结果为:showA showB;
以上,你做对了吗?
其他相关答案或补充知识点,欢迎在评论区留言补充!
扩展阅读
匿名字段
结构体中的字段可以不给名称,这时称为匿名字段。匿名字段的名称强制和类型相同。例如:
type person struct {name stringage int}type teacher struct {personintschool string}
上面teacher中有两个匿名字段person和int,匿名字段的名称和类型相同,等价于:
type teacher struct {person personint intschool string}
跟题2类似,teacher中嵌套了其他结构体(person)。其中teacher就称为外部struct,person就称为内部struct;
下期提问
- 下面代码的输出结果?
func hello(n int) {fmt.Println(n)}func main() {n := 5defer hello(n)n = n + 10}
答案及解析将在下期文章中给出,欢迎大家在评论区留言,独乐乐不如众乐乐,交流学习,互相进步。
欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”。