Golang:此类型实现哪种接口?

本质上,这里是关于Golang接口的四个问题,每个问题都比之前的问题难一些。</ p>


  1. 说我们导入了很多接口,A,B,C,...,G
    </ li> </ ol>

       import(
    “ A”,
    “ B”,
    “ C”,
    //更多...
    “ G”

    </ code> </ pre> \ n

    ,然后定义类型S:</ p>

     类型S struct {
    //更多...
    }
    </ code> </ pre>

    现在S是否“实现”接口之一:</ p>

      func(s S)Foo(){
    //更多.. 。
    }
    </ code> </ pre>

    到目前为止,除了查找和搜索接口声明外,还有其他方法可以告诉S实现了A-G的哪个接口 的A-G? 如果否,是否有一种方法可以明确告诉S实现哪个接口? 到目前为止,似乎已经推断出实现了哪个接口S。</ p>


    1. 对于同一示例,如果是B,C,D 接口都具有带有相同签名的Foo()方法。 在这种情况下,S实现哪个接口? </ p> </ li>

    2. 如果我们声明并定义接口B,C,而不是导入接口,是否取决于从B,C和D导入这些接口的顺序? D在同一个文件中,但是那些接口又都具有带有相同签名的Foo()方法,S实现哪个接口? 是否依赖于这些接口的声明或定义顺序?</ p> </ li>

    3. 如果我们在同一文件中声明并定义了B,C,D接口,则B具有Foo ()方法,C具有Bar()方法,D具有Foo()和Bar()。 现在,如果S实现Foo()和Bar(),那么S实现B和C,还是S仅实现D?</ p> </ li>
      </ ol>

      谢谢大家 !</ p>
      </ div>

展开原文

原文

In essence, four questions are here for Golang interfaces, with each one slightly harder than the one before it.

  1. say we imported a lot of interfaces, A, B, C, ..., G
import (
    "A",
    "B",
    "C",
    // more ...
    "G"
)

and we define a type S:

type S struct {
    // more ...
}

now if S "implements" one of the interfaces:

func (s S) Foo() {
    // more ...
}

Up to date, is there any other way to tell which interface of A - G does S implement, except for looking and searching into interface declarations of A - G? If no, is there a way to explicitly tell S to implement which interface? So far, it appears that the which interface S implemented is inferred.

  1. If, for the same example, B, C, D interfaces all have the Foo() method with the same signature. In this case, which interface does S implement? Does it depend on the order those interfaces are imported from B, C, and D?

  2. If, rather than importing interfaces, we declare and define interfaces B, C, D in the same file, but those interfaces again all have Foo() method with the same signature, which interface does S implement? Does it depend on the order those interfaces are declared, or defined?

  3. If, we declared and defined B, C, D interfaces in the same file, B has Foo() method, C has Bar() method, and D has both Foo() and Bar(). Now if S implement Foo() and Bar(), then does S implement B and C, or S only implements D?

Thanks, everyone!

douhong6187
douhong6187 是的,您是对的,应该是Foo而不是foo。谢谢!
大约 5 年之前 回复
doukan6564
doukan6564 我只是将foo解释为Foo,没有真正考虑公共/私有含义。我认为这是一个合理的假设,尽管值得注意,布鲁斯没有试图做出特别的区分:)
大约 5 年之前 回复
dongyao4419
dongyao4419 接口类型的规范可能会很有用。您总是可以尝试将一些具体T的实例分配给变量var(或varpkg.I)以测试理论,或者在运行时使用类型断言或类型开关来处理接口变量。
大约 5 年之前 回复
dongxiao3694
dongxiao3694 正如我认为霍布斯所说的那样,您的第三个问题似乎使用“相同文件”来表示“相同软件包”,但是软件包通常是多个文件。
大约 5 年之前 回复
douzheng5717
douzheng5717 通过使方法foo()(私有)而不是Foo(),可能在您的问题中引入了另一个难题。带有私有方法的接口不能以通常的方式通过包中所定义的包中的类型来实现。
大约 5 年之前 回复

1个回答




  1. 否。 (但是请注意,您不导入接口,而是导入程序包。)</ p> </ li>

  2. 所有它们。 顺序无关紧要。 如果您声明了类型为 B </ code>, C </ code>和 D </ code>的变量,则它们都将能够容纳 S </ code >。</ p> </ li>

  3. 所有这些。 在相同或不同文件中执行的操作无关紧要。</ p> </ li>

  4. 所有这些。 S </ code>实现了 B </ code>,因为 S </ code>具有 Foo()</ code>。 S </ code>实现 C </ code>,因为 S </ code>具有 Bar()</ code>。 S </ code>实现 D </ code>,因为 S </ code>同时具有 Foo()</ code>和 Bar()</ code>。 </ p> </ li>
    </ ol>
    </ div>

展开原文

原文

  1. No. (But as a side note, you don't import interfaces, you import packages.)

  2. All of them. Order doesn't matter. If you declared variables of type B, C, and D, all of them would be able to hold an S.

  3. All of them. What you do in the same or different files doesn't matter.

  4. All of them. S implements B because S has Foo(). S implements C because S has Bar(). S implements D because S has both Foo() and Bar().

duanjian7617
duanjian7617 是的,这是正确的。 这似乎是一种round回的方式,可以得到答案,而不是阅读规范的某些部分(从对问题的评论中链接)和/或制作一些文件并查看它们是否可以编译。
大约 5 年之前 回复
dongzheng3113
dongzheng3113 那讲得通。 看来我忘了在我的问题中包括该案了。 因此对于问题4,如果S仅实现Foo()方法,则S仅实现B接口,而不实现D接口,因为D具有未实现的额外Bar()。 对? 一旦一切合理,我将接受答案,很可能很快! 谢谢。
大约 5 年之前 回复
duanba3707
duanba3707 不能在接口中实现所有方法的类型不能实现该接口。
大约 5 年之前 回复
doudou5023
doudou5023 谢谢,霍布斯。 虽然这是有道理的,但却提出了另一个问题。 如果B,C或D具有不止一种方法,例如Foo(),但是S仅实现Foo(),而没有其他方法,那么您是否还会说类型B可以容纳S? 界面似乎是“不完整的实现”。
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐