golang吧 关注:6,257贴子:14,388
  • 8回复贴,共1

关于Golang中接口的设计问题

只看楼主收藏回复

刚开始学Golang,之前学过Java。在学到接口interface时,有一点疑惑,希望大佬解答;
与Java不同的是,Golang中的接口实现都是隐式的,不用手动指定实现哪个接口。假如有这么一个情况:

有两个接口的方法签名都是一样的,两个实现结构体都实现了接口中的方法,我们暂时不使用这些方法,就只是看这段代码,Asian到底是实现了Dog还是实现了Human,如果都实现了,Asian实现Dog显然是不可接受的。
在Java中都是显式的实现接口 `implements` ,Go这里的设计真的合理吗?
还是说我的理解有问题,希望大佬解答


IP属地:贵州1楼2024-07-12 17:09回复
    你没理解interface的本质,简单来说,你理解反了。是你归纳了具有这些方法的对象叫这个接口,而不是接口符合这个对象,因果关系弄反了。比如你定义了会游泳的是鸭子,但鹅也会游泳,那么鹅也应当是鸭子,不为什么,就因为是你定义会游泳的是鸭子。


    IP属地:广东来自Android客户端2楼2024-07-12 18:07
    回复
      在实际的开发过程中,在你所开发的这一层,往往你不清楚调用方的行为,但你总会明白你需要的是具有鸭子功能的对象,开发者和调用者只关心具有鸭子的方法,而不会去关注具体对象是什么,这种设计理念充斥在许多优秀的go库里。


      IP属地:广东来自Android客户端3楼2024-07-12 18:10
      回复
        以io.reader为例,在你使用它时,你只关心调用read方法,得到预期结果,而不关心,这个玩意是file还是conn还是什么玩意。无论是作为入参还是结果,都能让调用方,有很好的约束(例如,你传入了个符合接口的对象,会失败。例如你得到了一个接口,你只能安全的调用接口提供的方法,除非你清楚实体对象是什么)


        IP属地:广东来自Android客户端4楼2024-07-12 18:15
        收起回复
          你应该定义一个接口叫Name


          IP属地:辽宁来自iPhone客户端5楼2024-12-09 04:32
          回复