MST
星途 面试题库

面试题:Go接口类型断言在复杂数据结构中的应用

假设有一个包含接口类型的切片,切片中的元素可能是多种实现了同一接口的结构体实例。请编写代码,遍历该切片,使用类型断言判断每个元素的具体类型,并根据不同类型执行不同的业务逻辑(比如打印不同的信息)。要求代码结构清晰,能体现对接口类型断言在复杂数据结构下的灵活运用。
20.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// 定义接口
type Animal interface {
    Speak() string
}

// 定义结构体并实现接口
type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return fmt.Sprintf("Woof! I'm %s", d.Name)
}

type Cat struct {
    Name string
}

func (c Cat) Speak() string {
    return fmt.Sprintf("Meow! I'm %s", c.Name)
}

func main() {
    // 定义包含接口类型的切片
    animals := []Animal{
        Dog{Name: "Buddy"},
        Cat{Name: "Whiskers"},
    }

    // 遍历切片并进行类型断言
    for _, animal := range animals {
        if dog, ok := animal.(Dog); ok {
            fmt.Printf("This is a dog: %v\n", dog.Speak())
        } else if cat, ok := animal.(Cat); ok {
            fmt.Printf("This is a cat: %v\n", cat.Speak())
        } else {
            fmt.Println("Unknown animal type")
        }
    }
}

上述代码定义了一个 Animal 接口以及两个实现该接口的结构体 DogCat。在 main 函数中,创建了一个包含 Animal 接口类型的切片,并遍历该切片。使用类型断言判断每个元素的具体类型,并根据不同类型执行不同的打印逻辑。

如果你使用的是其他编程语言,如Python,可以这样实现:

from abc import ABC, abstractmethod

# 定义抽象基类(类似于接口)
class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

# 定义具体类并实现抽象方法
class Dog(Animal):
    def __init__(self, name):
        self.name = name

    def speak(self):
        return f"Woof! I'm {self.name}"

class Cat(Animal):
    def __init__(self, name):
        self.name = name

    def speak(self):
        return f"Meow! I'm {self.name}"

if __name__ == "__main__":
    # 定义包含抽象基类类型的列表
    animals = [Dog("Buddy"), Cat("Whiskers")]

    # 遍历列表并进行类型判断
    for animal in animals:
        if isinstance(animal, Dog):
            print(f"This is a dog: {animal.speak()}")
        elif isinstance(animal, Cat):
            print(f"This is a cat: {animal.speak()}")
        else:
            print("Unknown animal type")

在Python中,通过 isinstance 函数来进行类型判断,根据不同类型执行不同的打印逻辑。