面试题答案
一键面试类型的方法集与接口实现的关系
在Go语言中,接口的实现是隐式的,一个类型只要实现了某个接口中定义的所有方法,那么这个类型就被认为实现了该接口。而这些实现接口的方法,就属于该类型的方法集。也就是说,接口的实现依赖于类型的方法集,当一个类型的方法集包含了某个接口定义的全部方法时,该类型就实现了这个接口。
方法集变化对接口实现的影响
- 方法集新增方法:如果一个类型的方法集新增了某个接口定义的方法,那么该类型可能开始实现这个接口(前提是新增该方法后满足接口定义的所有方法)。
- 方法集移除方法:如果一个类型的方法集移除了某个已实现接口中的方法,那么该类型将不再实现这个接口。
举例说明
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
接口的方法要求。