MST

星途 面试题库

面试题:Go接口使用形式:方法集与接口实现的关系

在Go语言中,简述类型的方法集与接口实现之间的关系。当一个类型的方法集发生变化时,对其实现的接口会产生怎样的影响?请举例说明。
35.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

类型的方法集与接口实现的关系

在Go语言中,接口的实现是隐式的,一个类型只要实现了某个接口中定义的所有方法,那么这个类型就被认为实现了该接口。而这些实现接口的方法,就属于该类型的方法集。也就是说,接口的实现依赖于类型的方法集,当一个类型的方法集包含了某个接口定义的全部方法时,该类型就实现了这个接口。

方法集变化对接口实现的影响

  1. 方法集新增方法:如果一个类型的方法集新增了某个接口定义的方法,那么该类型可能开始实现这个接口(前提是新增该方法后满足接口定义的所有方法)。
  2. 方法集移除方法:如果一个类型的方法集移除了某个已实现接口中的方法,那么该类型将不再实现这个接口。

举例说明

package main

import "fmt"

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

// 定义一个类型
type Book struct {
    Title string
}

// 为Book类型实现Print方法,此时Book类型实现了Printer接口
func (b Book) Print() {
    fmt.Printf("Book Title: %s\n", b.Title)
}

func main() {
    var p Printer
    book := Book{Title: "Go语言编程"}
    p = book
    p.Print()

    // 假设现在移除Book类型的Print方法,
    // 那么Book类型将不再实现Printer接口,编译时会报错
    // 这里仅作说明,实际移除方法需要修改代码结构
}

假设后续我们在Book类型上添加一个新方法Info,这并不会影响Book类型对Printer接口的实现。但如果移除Print方法,在尝试将Book类型赋值给Printer接口类型变量时就会出现编译错误,因为Book类型不再满足Printer接口的方法要求。