- 外层结构体方法集的形成:
- 当结构体嵌套(组合)时,外层结构体的方法集包含其自身定义的方法,以及嵌套的结构体的导出方法(首字母大写的方法)。例如:
package main
import "fmt"
type Inner struct {
}
func (i *Inner) InnerMethod() {
fmt.Println("This is InnerMethod")
}
type Outer struct {
Inner
}
func (o *Outer) OuterMethod() {
fmt.Println("This is OuterMethod")
}
func main() {
o := Outer{}
o.OuterMethod()
o.InnerMethod()
}
- 在上述代码中,
Outer
结构体嵌套了 Inner
结构体,Outer
结构体的方法集包含 OuterMethod
和 InnerMethod
(因为 InnerMethod
是导出方法)。
- 嵌套结构体有匿名字段时方法集的形成规则:
- 如果嵌套的结构体本身有匿名字段,那么外层结构体方法集的形成规则基本相同,但是要遵循同样的导出规则。例如:
package main
import "fmt"
type InnerInner struct {
}
func (ii *InnerInner) InnerInnerMethod() {
fmt.Println("This is InnerInnerMethod")
}
type Inner struct {
InnerInner
}
func (i *Inner) InnerMethod() {
fmt.Println("This is InnerMethod")
}
type Outer struct {
Inner
}
func (o *Outer) OuterMethod() {
fmt.Println("This is OuterMethod")
}
func main() {
o := Outer{}
o.OuterMethod()
o.InnerMethod()
o.InnerInnerMethod()
}
- 这里
Inner
结构体有一个匿名字段 InnerInner
,Outer
结构体嵌套了 Inner
结构体。Outer
结构体的方法集包含自身的 OuterMethod
,Inner
的导出方法 InnerMethod
,以及 InnerInner
的导出方法 InnerInnerMethod
。只有导出的方法才会被添加到外层结构体的方法集中。非导出方法(首字母小写的方法)不会被包含在外层结构体的方法集中。