📅  最后修改于: 2023-12-03 14:41:35.061000             🧑  作者: Mango
在 Golang 中,我们可以对一个结构体类型定义方法,而这些方法也可以被结构体的实例调用。但是,在 Golang 中,我们还可以为结构体定义提升方法(Promoted Method)。
提升方法是指从一个结构体类型中嵌入的另一个结构体类型结构体中定义的方法。这些方法被称为“提升”方法,因为它们从内部结构体中提升到外部结构体中。
当一个方法被提升到一个外部结构体中时,它会自动绑定到外部结构体的实例上,并且可以直接通过该实例进行调用。这为我们编写简洁,易读且高效的代码提供了便利。
在 Golang 中,我们可以使用嵌套结构体来定义一个结构体类型中的其他结构体类型。以此,我们也可以定义提升方法。
type Person struct {
Name string
Age int
ContactInfo Contact
}
type Contact struct {
Email string
Address string
}
func (c Contact) Notify() {
fmt.Printf("Sending notification to %s at %s\n", c.Email, c.Address)
}
func main() {
p := Person{
Name: "John",
Age: 30,
ContactInfo: Contact{
Email: "john@example.com",
Address: "1234 Main St",
},
}
p.Notify() // 结果:Sending notification to john@example.com at 1234 Main St
}
在上面的例子中,我们定义了一个Person结构体类型,以及一个嵌套的Contact结构体类型。我们还在Contact结构体类型中定义了一个Notify方法。
由于我们在Person结构体类型中嵌套了Contact结构体类型,因此Person结构体类型自动继承了Contact结构体类型中的Notify方法。因此,我们可以在Person结构体的实例中直接调用Notify方法。
在某些情况下,我们可能想要为一个结构体类型定义一个新的方法,覆盖从嵌套内部结构体中继承的提升方法。
为此,我们只需要使用和声明新方法的相同名称来重写所提升的方法。这将会在新方法名被绑定到外部结构体的实例上时覆盖自动提升的方法。
type Person struct {
Name string
Age int
ContactInfo Contact
}
type Contact struct {
Email string
Address string
}
func (c Contact) Notify() {
fmt.Printf("Sending notification to %s at %s\n", c.Email, c.Address)
}
func (p Person) Notify() {
fmt.Printf("Sending notification to %s\n", p.Name)
}
func main() {
p := Person{
Name: "John",
Age: 30,
ContactInfo: Contact{
Email: "john@example.com",
Address: "1234 Main St",
},
}
p.ContactInfo.Notify() // 结果:Sending notification to john@example.com at 1234 Main St
p.Notify() // 结果:Sending notification to John
}
在上面的例子中,我们重写了从嵌套Contact结构体中提升的Notify方法,创建了一个新的Notify方法来覆盖它。虽然Contact类型上的Notify方法仍然可以被访问,但是当我们在Person类型的实例上调用Notify方法时,新方法将被绑定并执行。
提升方法是 Golang 中一个很棒的特性,允许我们编写简洁、易读且高效的代码。使用嵌套结构体和提升方法可以使我们在更少的代码量下实现更丰富的功能。