当前位置: 代码迷 >> 综合 >> Golang duck typing(鸭子类型)的概念
  详细解决方案

Golang duck typing(鸭子类型)的概念

热度:13   发布时间:2023-11-27 10:35:32.0
  • “像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子”
  • 描述事物的外部行为而非内部结构
  • 严格说go属于结构化类型系统,类似dock typing

先看一个其他语言中的duck typing :

  • python中的duck typing
    def download(retriever):return retriever.get("www.fabric.com")
    •  运行时才知道传入的retriever有没有get
    • 需要注释说明接口
  • c++中的duck typing 

    template <class R>
    string download(const R& retriever) {return retriever.get("www.fabric.com");
    }
    • 编译时才知道传入的 有没有get

    • 需要注释说明接口

  • java中的类似代码

    <R extends Retriever>
    String download(R r) {return r.get("www.fabric.com");
    }
    • 传入的参数必须实现Retriever接口

    • 不是duck typing

  • go语言中的duck typing

    • 接口由使用者定义,谁用谁定义

      // 实现者
      package faketype Retriever struct{Contents string
      }func (r Retriever) Get(url string) string {return r.Contents
      }// 使用者
      type Retriever interface {Get(url string) string
      }func download(r Retriever) string {return r.Get("https://www.hyperledger.org/")
      }func main() {var r Retrieverr = fake.Retriever{"this is a fake fabric.com"}fmt.Println(download(r))// 等价于// fmt.Println(download(//        fake.Retrivever{//            "this is a fake fabric.com"}))
      }