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

  • “像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子”
  • 描述事物的外部行为而非内部结构
  • 严格说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 fake
      
      type 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 Retriever
      	r = fake.Retriever{"this is a fake fabric.com"}
          fmt.Println(download(r))
          // 等价于
          // fmt.Println(download(
          //        fake.Retrivever{
          //            "this is a fake fabric.com"}))
      }
      

       

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值