MST
星途 面试题库

面试题:Go语言中接口类型断言与类型开关在接口多态实现中的应用

在Go语言中,假设你有一个接口类型的切片`[]interface{}`,其中存储了不同类型的值(如`int`、`string`、自定义结构体等),且这些类型都实现了同一个接口。请编写代码,使用类型断言和类型开关,分别遍历这个切片,对实现了特定接口方法的类型执行该方法。解释这两种方式在处理接口多态时的特点和适用场景。
36.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

使用类型断言遍历切片

package main

import (
    "fmt"
)

// 定义一个接口
type Printer interface {
    Print()
}

// 定义一个结构体并实现Printer接口
type MyStruct struct {
    Value string
}

func (m MyStruct) Print() {
    fmt.Println("MyStruct: ", m.Value)
}

func main() {
    var data []interface{}
    data = append(data, 10, "hello", MyStruct{Value: "world"})

    for _, item := range data {
        if printer, ok := item.(Printer); ok {
            printer.Print()
        }
    }
}

使用类型开关遍历切片

package main

import (
    "fmt"
)

// 定义一个接口
type Printer interface {
    Print()
}

// 定义一个结构体并实现Printer接口
type MyStruct struct {
    Value string
}

func (m MyStruct) Print() {
    fmt.Println("MyStruct: ", m.Value)
}

func main() {
    var data []interface{}
    data = append(data, 10, "hello", MyStruct{Value: "world"})

    for _, item := range data {
        switch v := item.(type) {
        case Printer:
            v.Print()
        }
    }
}

特点和适用场景

  1. 类型断言
    • 特点:直接尝试将接口值断言为特定类型,如果断言成功则可以直接使用该类型的方法。代码相对简洁,对于明确知道可能出现的类型且逻辑较为简单的场景很适用。
    • 适用场景:当你确切知道接口可能包含的具体类型,并且只需要处理一两种特定类型时,类型断言更为直接和高效。例如,在一个已知只包含intMyStruct类型且MyStruct实现了特定接口的切片中,使用类型断言来处理MyStruct的方法调用。
  2. 类型开关
    • 特点:可以同时处理多种类型,代码结构清晰,通过switch语句的分支来处理不同类型的逻辑。在处理多种类型时,代码可读性更好,更易于维护。
    • 适用场景:当接口可能包含多种不同类型,并且需要针对每种类型执行不同的逻辑时,类型开关更为合适。例如,在一个通用的处理函数中,接口切片可能包含多种自定义类型,每种类型都有不同的接口实现,使用类型开关可以清晰地针对不同类型进行处理。