Go 18.0 专业五


02. 匿名字段

<h1>1. 匿名字段</h1> <p>Golang匿名字段 :可以像字段成员那样访问匿名字段方法,编译器负责查找。</p> <pre><code>package main import "fmt" type User struct { id int name string } type Manager struct { User } func (self *User) ToString() string { // receiver = &amp;(Manager.User) return fmt.Sprintf("User: %p, %v", self, self) } func main() { m := Manager{User{1, "Tom"}} fmt.Printf("Manager: %p\n", &amp;m) fmt.Println(m.ToString()) }</code></pre> <p>输出结果:</p> <pre><code> Manager: 0xc42000a060 User: 0xc42000a060, &amp;{1 Tom}</code></pre> <p>通过匿名字段,可获得和继承类似的复用能力。依据编译器查找次序,只需在外层定义同名方法,就可以实现 &quot;override&quot;。</p> <pre><code>package main import "fmt" type User struct { id int name string } type Manager struct { User title string } func (self *User) ToString() string { return fmt.Sprintf("User: %p, %v", self, self) } func (self *Manager) ToString() string { return fmt.Sprintf("Manager: %p, %v", self, self) } func main() { m := Manager{User{1, "Tom"}, "Administrator"} fmt.Println(m.ToString()) fmt.Println(m.User.ToString()) }</code></pre> <p>输出结果:</p> <pre><code> Manager: 0xc420074180, &amp;{{1 Tom} Administrator} User: 0xc420074180, &amp;{1 Tom}</code></pre>

页面列表

ITEM_HTML