1. 匿名字段

Golang匿名字段 :可以像字段成员那样访问匿名字段方法,编译器负责查找。

  1. package main
  2. import "fmt"
  3. type User struct {
  4. id int
  5. name string
  6. }
  7. type Manager struct {
  8. User
  9. }
  10. func (self *User) ToString() string { // receiver = &(Manager.User)
  11. return fmt.Sprintf("User: %p, %v", self, self)
  12. }
  13. func main() {
  14. m := Manager{User{1, "Tom"}}
  15. fmt.Printf("Manager: %p\n", &m)
  16. fmt.Println(m.ToString())
  17. }

输出结果:

  1. Manager: 0xc42000a060
  2. User: 0xc42000a060, &{1 Tom}

通过匿名字段,可获得和继承类似的复用能力。依据编译器查找次序,只需在外层定义同名方法,就可以实现 "override"。

  1. package main
  2. import "fmt"
  3. type User struct {
  4. id int
  5. name string
  6. }
  7. type Manager struct {
  8. User
  9. title string
  10. }
  11. func (self *User) ToString() string {
  12. return fmt.Sprintf("User: %p, %v", self, self)
  13. }
  14. func (self *Manager) ToString() string {
  15. return fmt.Sprintf("Manager: %p, %v", self, self)
  16. }
  17. func main() {
  18. m := Manager{User{1, "Tom"}, "Administrator"}
  19. fmt.Println(m.ToString())
  20. fmt.Println(m.User.ToString())
  21. }

输出结果:

  1. Manager: 0xc420074180, &{{1 Tom} Administrator}
  2. User: 0xc420074180, &{1 Tom}