MST

星途 面试题库

面试题:Go中组合方法集形成机制相关基础

在Go语言中,简述结构体嵌套(组合)时,外层结构体方法集是如何形成的,并且说明如果嵌套的结构体本身有匿名字段,这种情况下方法集的形成规则有何不同?
38.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 外层结构体方法集的形成
    • 当结构体嵌套(组合)时,外层结构体的方法集包含其自身定义的方法,以及嵌套的结构体的导出方法(首字母大写的方法)。例如:
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 结构体的方法集包含 OuterMethodInnerMethod(因为 InnerMethod 是导出方法)。
  1. 嵌套结构体有匿名字段时方法集的形成规则
    • 如果嵌套的结构体本身有匿名字段,那么外层结构体方法集的形成规则基本相同,但是要遵循同样的导出规则。例如:
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 结构体有一个匿名字段 InnerInnerOuter 结构体嵌套了 Inner 结构体。Outer 结构体的方法集包含自身的 OuterMethodInner 的导出方法 InnerMethod,以及 InnerInner 的导出方法 InnerInnerMethod。只有导出的方法才会被添加到外层结构体的方法集中。非导出方法(首字母小写的方法)不会被包含在外层结构体的方法集中。