面试题答案
一键面试1. 类型相同性角度分析
在 Go 语言中,虽然 Cat
和 Dog
结构体类型不同,但它们都实现了 Printer
接口。在 Go 语言的接口实现规则里,只要类型实现了接口中定义的所有方法,就认为该类型实现了此接口。所以 Cat
和 Dog
都实现了 Printer
接口中的 Print
方法,它们都属于 Printer
接口类型。因此,Cat
和 Dog
类型的变量可以作为同一类可接受的参数类型传递给 func DoPrint(p Printer)
,因为在这个函数参数的视角下,它们都满足 Printer
接口类型的要求。
2. 通用比较函数代码实现
package main
import "fmt"
type Printer interface {
Print()
}
type Cat struct {
Name string
}
func (c Cat) Print() {
fmt.Printf("Cat's name is %s\n", c.Name)
}
type Dog struct {
Name string
}
func (d Dog) Print() {
fmt.Printf("Dog's name is %s\n", d.Name)
}
func DoPrint(p Printer) {
p.Print()
}
func CompareNames(c Cat, d Dog) bool {
return c.Name == d.Name
}
在上述代码中,定义了 CompareNames
函数,该函数接受 Cat
和 Dog
结构体类型的参数,直接比较它们的 Name
字段是否相等,并返回比较结果。