面试题答案
一键面试匿名字段特点
- 简化访问:可以直接访问匿名字段的成员,无需通过匿名字段名作为中间层。例如,若结构体
A
嵌入了结构体B
(B
作为A
的匿名字段),A
的实例可以直接访问B
的成员。 - 名字冲突:如果不同层次的匿名字段有相同名字的成员,访问时会优先选择最内层定义的成员。
- 方法继承:匿名字段的方法会“提升”到包含它的结构体中,使得包含它的结构体仿佛拥有这些方法。
方法继承与复用示例
package main
import "fmt"
// 定义一个基础结构体
type Animal struct {
Name string
}
// 为Animal结构体定义一个方法
func (a Animal) Speak() {
fmt.Printf("%s makes a sound\n", a.Name)
}
// 定义一个继承自Animal的结构体
type Dog struct {
Animal
Breed string
}
func main() {
// 创建Dog实例
myDog := Dog{
Animal: Animal{Name: "Buddy"},
Breed: "Golden Retriever",
}
// Dog实例可以直接调用Animal的Speak方法
myDog.Speak()
}
在上述示例中,Dog
结构体嵌入了Animal
结构体作为匿名字段。这样Dog
结构体就继承了Animal
的Speak
方法,myDog
实例可以直接调用Speak
方法,实现了方法的复用。