MST

星途 面试题库

面试题:Go语言类型相同性在接口实现中的判断

定义一个接口 `type Printer interface { Print() }`,有两个结构体 `type Cat struct { Name string }` 和 `type Dog struct { Name string }`,它们各自实现了 `Print` 方法。现在有一个函数 `func DoPrint(p Printer)`,如果将 `Cat` 和 `Dog` 类型视为同一类可接受的参数类型传递给 `DoPrint`,从类型相同性角度分析为什么可以这样做?若要基于类型相同性,实现一个通用的比较函数,比较 `Cat` 和 `Dog` 的 `Name` 是否相同,该如何编写代码?
32.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

1. 类型相同性角度分析

在 Go 语言中,虽然 CatDog 结构体类型不同,但它们都实现了 Printer 接口。在 Go 语言的接口实现规则里,只要类型实现了接口中定义的所有方法,就认为该类型实现了此接口。所以 CatDog 都实现了 Printer 接口中的 Print 方法,它们都属于 Printer 接口类型。因此,CatDog 类型的变量可以作为同一类可接受的参数类型传递给 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 函数,该函数接受 CatDog 结构体类型的参数,直接比较它们的 Name 字段是否相等,并返回比较结果。