我无法理解 String() 方法如何用于 Go 中的嵌入式结构。请考虑以下情况:
type Engineer struct {
Person
TaxPayer
Specialization string
}
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age)
}
type TaxPayer struct {
TaxBracket int
}
func (t TaxPayer) String() string {
return fmt.Sprintf("%d", t.TaxBracket)
}
func main() {
engineer := Engineer{
Person: Person{
Name: "John Doe",
Age: 35,
},
TaxPayer: TaxPayer{3},
Specialization: "Construction",
}
fmt.Println(engineer)
}
此代码的输出为 。但是,如果我删除方法定义,则输出只是(它调用)。但是,如果我也删除方法定义,则输出为 。我最初认为必须为整个结构定义一个隐式方法,但没有这样的方法。{name: John Doe, age: 35 3 Construction}Person.String()3engineer.TaxPayer.String()TaxPayer.String(){{John Doe 35} {3} Construction}String()Engineer
为什么方法调用会以这种方式运行?如果我将每个嵌入式类型的方法命名为除(比如说)以外的任何东西,然后尝试这样做,我得到一个(预期的)编译错误:。为什么在改为方法名称时不引发此错误?String()Foo()fmt.Println(engineer.Foo())ambiguous selector engineer.FooString()
大话西游666
相关分类