1. 结构体作为一种变量它可以放进另外一个结构体作为一个字段来使用,这种内嵌结构体的形式在 Go 语言里称之为「组合」。下面我们来看看内嵌结构体的基本使用方法
  1. package main
  2. import "fmt"
  3. type Teacher struct {
  4. name string
  5. age int
  6. title string
  7. }
  8. type Course struct {
  9. teacher Teacher
  10. price int
  11. name string
  12. url string
  13. }
  14. func getInfo(c Course){
  15. fmt.Println(c.teacher.name, c.teacher.age)
  16. }
  17. func main() {
  18. var c Course = Course {
  19. teacher: Teacher{
  20. name:"bobby",
  21. age:18,
  22. title: "架构师",
  23. },
  24. price: 100,
  25. name: "scrapy分布式爬虫",
  26. url: "", // 注意这里的逗号不能少
  27. }
  28. getInfo(c)
  29. }

8.2.1 匿名内嵌结构体

还有一种特殊的内嵌结构体形式,内嵌的结构体不提供名称。这时外面的结构体将直接继承内嵌结构体所有的内部字段和方法,就好像把子结构体的一切全部都揉进了父结构体一样。匿名的结构体字段将会自动获得以结构体类型的名字命名的字段名称

  1. package main
  2. import "fmt"
  3. type Teacher struct {
  4. name string
  5. age int
  6. title string
  7. }
  8. type Course struct {
  9. Teacher
  10. price int
  11. name string
  12. url string
  13. }
  14. func getInfo(c Course){
  15. fmt.Println(c.name, c.age)
  16. }
  17. func main() {
  18. var c Course = Course {
  19. Teacher: Teacher{ //还可以这样声明一些属性值,因为Teacher是结构体,匿名,所以需要这样声明
  20. "bobby", 18, "",
  21. },
  22. price: 100,
  23. name: "scrapy分布式爬虫",
  24. url: "", // 注意这里的逗号不能少
  25. }
  26. getInfo(c)
  27. }

:::info

如果嵌入结构的字段和外部结构的字段相同,那么,想要修改嵌入结构的字段值需要加上外部结构中声明的嵌入结构名称

:::

  1. func getInfo(c Course){
  2. fmt.Println(c.Teacher.name, c.age)
  3. }

8.2.2 Go 语言的结构体没有多态性

Go 语言不是面向对象语言在于它的结构体不支持多态,它不能算是一个严格的面向对象语言。多态是指父类定义的方法可以调用子类实现的方法,不同的子类有不同的实现,从而给父类的方法带来了多样的不同行为。但是go语言支持鸭子类型

:::info 所谓的继承仅仅是形式上的语法糖,c.show() 被转换成二进制代码后和 c.Point.show() 是等价的,c.x 和 c.Point.x 也是等价的。 :::