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 = &(Manager.User)
return fmt.Sprintf("User: %p, %v", self, self)
}
func main() {
m := Manager{User{1, "Tom"}}
fmt.Printf("Manager: %p\n", &m)
fmt.Println(m.ToString())
}</code></pre>
<p>输出结果:</p>
<pre><code> Manager: 0xc42000a060
User: 0xc42000a060, &{1 Tom}</code></pre>
<p>通过匿名字段,可获得和继承类似的复用能力。依据编译器查找次序,只需在外层定义同名方法,就可以实现 "override"。</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, &{{1 Tom} Administrator}
User: 0xc420074180, &{1 Tom}</code></pre>