MST

星途 面试题库

面试题:Go语言类型断言在接口嵌套场景下的应用

假设有如下接口嵌套定义: ```go // 定义接口A type A interface { MethodA() } // 定义接口B type B interface { A MethodB() } ``` 请编写代码实现一个函数,该函数接收一个 `interface{}` 类型的参数,通过类型断言判断该参数是否实现了 `B` 接口,如果实现了则调用 `MethodA` 和 `MethodB` 方法。同时说明在这种接口嵌套情况下,类型断言需要注意的要点。
47.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

// 定义接口A
type A interface {
    MethodA()
}

// 定义接口B
type B interface {
    A
    MethodB()
}

// 实现接口A的结构体
type StructA struct{}

func (sa StructA) MethodA() {
    fmt.Println("执行 MethodA")
}

// 实现接口B的结构体
type StructB struct {
    StructA
}

func (sb StructB) MethodB() {
    fmt.Println("执行 MethodB")
}

// 接收interface{}类型参数并进行类型断言和方法调用的函数
func callMethods(i interface{}) {
    if b, ok := i.(B); ok {
        b.MethodA()
        b.MethodB()
    } else {
        fmt.Println("参数未实现B接口")
    }
}

类型断言要点

  1. 判断类型是否实现接口:在Go语言中,类型断言i.(B)用于判断接口值i是否包含了实现B接口的具体类型。如果包含,则断言成功,oktrue,同时b为断言成功后的B接口类型值,可以调用B接口及其嵌入的A接口的方法。
  2. 接口嵌套特性:由于B接口嵌套了A接口,一个类型只要实现了B接口的所有方法(包括A接口的方法,因为嵌套意味着继承了A接口的方法集),就可以被断言为B接口类型。所以在进行类型断言判断是否实现B接口时,无需单独判断是否实现A接口。实现B接口的类型必然也实现了A接口,可直接调用A接口的方法。