面试题答案
一键面试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
接口以及两个实现该接口的结构体 Dog
和 Cat
。在 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
函数来进行类型判断,根据不同类型执行不同的打印逻辑。