1. 接口

go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段

  1. package main
  2. import "fmt"
  3. // go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段
  4. //人
  5. type Person struct {
  6. name string
  7. sex string
  8. age int
  9. }
  10. type Student struct {
  11. Person
  12. id int
  13. addr string
  14. }
  15. func main() {
  16. // 初始化
  17. s1 := Student{Person{"5lmh", "man", 20}, 1, "bj"}
  18. fmt.Println(s1)
  19. s2 := Student{Person: Person{"5lmh", "man", 20}}
  20. fmt.Println(s2)
  21. s3 := Student{Person: Person{name: "5lmh"}}
  22. fmt.Println(s3)
  23. }

输出结果:

  1. {{5lmh man 20} 1 bj}
  2. {{5lmh man 20} 0 }
  3. {{5lmh 0} 0 }

同名字段的情况

  1. package main
  2. import "fmt"
  3. //人
  4. type Person struct {
  5. name string
  6. sex string
  7. age int
  8. }
  9. type Student struct {
  10. Person
  11. id int
  12. addr string
  13. //同名字段
  14. name string
  15. }
  16. func main() {
  17. var s Student
  18. // 给自己字段赋值了
  19. s.name = "5lmh"
  20. fmt.Println(s)
  21. // 若给父类同名字段赋值,如下
  22. s.Person.name = "枯藤"
  23. fmt.Println(s)
  24. }

输出结果:

  1. {{ 0} 0 5lmh}
  2. {{枯藤 0} 0 5lmh}

所有的内置类型和自定义类型都是可以作为匿名字段去使用

  1. package main
  2. import "fmt"
  3. //人
  4. type Person struct {
  5. name string
  6. sex string
  7. age int
  8. }
  9. // 自定义类型
  10. type mystr string
  11. // 学生
  12. type Student struct {
  13. Person
  14. int
  15. mystr
  16. }
  17. func main() {
  18. s1 := Student{Person{"5lmh", "man", 18}, 1, "bj"}
  19. fmt.Println(s1)
  20. }

输出结果:

  1. {{5lmh man 18} 1 bj}

指针类型匿名字段

  1. package main
  2. import "fmt"
  3. //人
  4. type Person struct {
  5. name string
  6. sex string
  7. age int
  8. }
  9. // 学生
  10. type Student struct {
  11. *Person
  12. id int
  13. addr string
  14. }
  15. func main() {
  16. s1 := Student{&Person{"5lmh", "man", 18}, 1, "bj"}
  17. fmt.Println(s1)
  18. fmt.Println(s1.name)
  19. fmt.Println(s1.Person.name)
  20. }

输出结果:

  1. {0xc00005c360 1 bj}
  2. zs
  3. zs