面试题答案
一键面试接口类型的定义方式
在Go语言中,接口类型通过 interface
关键字定义,它定义了一组方法的签名,但不包含方法的实现。示例如下:
type Animal interface {
Speak() string
}
上述代码定义了一个名为 Animal
的接口,它包含一个 Speak
方法,该方法返回一个字符串。
通过接口类型实现多态性
在Go语言中,只要某个类型实现了接口中定义的所有方法,那么这个类型就被认为实现了该接口,无需像其他语言那样显式声明实现某个接口。通过接口类型实现多态性的示例如下:
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return "Woof!"
}
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return "Meow!"
}
func MakeSound(a Animal) {
fmt.Println(a.Speak())
}
func main() {
dog := Dog{Name: "Buddy"}
cat := Cat{Name: "Whiskers"}
MakeSound(dog) // 输出: Woof!
MakeSound(cat) // 输出: Meow!
}
在上述示例中,Dog
和 Cat
类型都实现了 Animal
接口的 Speak
方法。MakeSound
函数接受一个 Animal
接口类型的参数,无论传入 Dog
还是 Cat
类型的实例,都会调用相应类型的 Speak
方法,从而实现多态性。
空接口 interface{}
的常见使用场景
- 存储任意类型的值:空接口可以用来存储任何类型的值,因为Go语言中所有类型都实现了空接口。例如:
var data interface{}
data = 10 // 存储整数
data = "hello" // 存储字符串
- 函数接受任意类型参数:在函数参数中使用空接口可以让函数接受任意类型的参数。例如:
func PrintValue(v interface{}) {
fmt.Printf("Value is of type %T and value is %v\n", v, v)
}
func main() {
PrintValue(10)
PrintValue("hello")
}
- 用于切片、映射等容器:可以创建一个能存储任意类型值的切片或映射。例如:
var anySlice []interface{}
anySlice = append(anySlice, 10)
anySlice = append(anySlice, "hello")
anyMap := make(map[string]interface{})
anyMap["num"] = 10
anyMap["str"] = "world"