当前位置: 首页 > 面试题库 >

两种不同的类型如何使用接口在golang中实现相同的方法?

仲孙文乐
2023-03-14
问题内容

说我有两个结构:

type First struct {
    str string
}
type Second struct {
    str string
}

我希望他们都实现接口A:

type A interface {
    PrintStr() //print First.str or Second.str
}

像这样对First和Second结构都实现似乎是多余的:

func (f First) PrintStr() {
    fmt.Print(f.str)
}

func (s Second) PrintStr() {
    fmt.Print(s.str)
}

有没有一种方法可以为实现接口A的所有结构提供一个实现?像这样的东西,但似乎不起作用:

func (a A) PrintStr() {
    fmt.Print(a.str)
}

谢谢!


问题答案:

不,您不能, 但是 您可以创建一个基本类型,然后将其嵌入到您的2结构中,因此只需要一个基本类型的实现即可:

type WithString struct {
    str string
}

type First struct {
    WithString
}

type Second struct {
    WithString
}

type A interface {
    PrintStr() //print First.str or Second.str
}

func (w WithString) PrintStr() {
    fmt.Print(w.str)
}

用法:

a := First{
    WithString: WithString{
        str: "foo",
    },
}

操场上的完整例子

嵌入文件



 类似资料:
  • 问题内容: 假设我必须实现在两个不同的包中声明的两个不同的接口(在两个不同的独立项目中)。 我有包装 并包装 在我的包里 如何处理这种情况? 问题答案: 正如常见问题解答所提到的 其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。 在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定 。 在您的情况下,您将满足两个接口。 您可

  • 我在Java中有两个几乎相同的方法。唯一的区别是它们有不同的参数类型。它们使用泛型并返回输入参数的类型T。我怎样才能摆脱重复的代码?下面是我的两个方法。最后,它们都使用不同的类型调用Spring。否则,方法是相同的。

  • 问题内容: 我有以下接口,我想在类中多次实现: 现在,我希望能够通过以下方式实现此接口: 但是,这给了我错误:在行上: 是否可以使用不同的泛型两次实现接口?如果不是,那么我在这里可以做的下一步工作是什么? 问题答案: 您需要使用内部或匿名类。例如:

  • 问题内容: 考虑以下代码: 这会导致以下错误: 类型B和A不兼容;都定义了another(),但是返回类型不相关 我已经看到了这样的问题,并按照公认的答案中的不兼容示例进行操作-即 但是,在那种情况下,返回类型确实是不兼容的-返回类型不能同时为void和布尔值。而在上面的示例中,返回类型是an 和a ,因此可以实现两个扩展接口。 此外,在查看了JLS(8.4.8、8.4.8.3、8.4.8.4)之

  • 问题内容: 具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口? 例如: 问题答案: 如果一个类型实现两个接口,并且每个接口定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还

  • 我的两个方法中的操作是相同的,但是输入参数类型不同,那么我该如何优化这两个方法,似乎没有那么重复?因为它们的操作是相同的,但参数类型不同,我该怎么做才能使这段代码更优雅呢?