MST

星途 面试题库

面试题:Go类型系统之接口类型理解

在Go语言类型系统中,接口类型是非常重要的一部分。请阐述接口类型的定义方式,以及如何通过接口类型实现多态性。另外,举例说明空接口interface{}的常见使用场景。
34.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

接口类型的定义方式

在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!
}

在上述示例中,DogCat 类型都实现了 Animal 接口的 Speak 方法。MakeSound 函数接受一个 Animal 接口类型的参数,无论传入 Dog 还是 Cat 类型的实例,都会调用相应类型的 Speak 方法,从而实现多态性。

空接口 interface{} 的常见使用场景

  1. 存储任意类型的值:空接口可以用来存储任何类型的值,因为Go语言中所有类型都实现了空接口。例如:
var data interface{}
data = 10 // 存储整数
data = "hello" // 存储字符串
  1. 函数接受任意类型参数:在函数参数中使用空接口可以让函数接受任意类型的参数。例如:
func PrintValue(v interface{}) {
    fmt.Printf("Value is of type %T and value is %v\n", v, v)
}

func main() {
    PrintValue(10)
    PrintValue("hello")
}
  1. 用于切片、映射等容器:可以创建一个能存储任意类型值的切片或映射。例如:
var anySlice []interface{}
anySlice = append(anySlice, 10)
anySlice = append(anySlice, "hello")

anyMap := make(map[string]interface{})
anyMap["num"] = 10
anyMap["str"] = "world"