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

喷火龙 等级 308 0 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 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"}))
      } 

本文转自 https://blog.csdn.net/qq_37858332/article/details/99715083,如有侵权,请联系删除。

收藏
评论区

相关推荐

关于Golang的那些事(一) -- Node.js和Golang对比
之前一直用Node.js作为开发语言,用了差不多4年的Node.js,涉及前端和后端,最近看到Golang这个新兴之秀挺火的,于是想探究探究一下这门语言,对比了一下他们的Github repo,截止现在Node.js的repo有72.5K星, issue数量是859个,Golang的repo有75.7K星,issue数量是5K个。从趋势来看,Golang来势
golang 中神奇的 slice
声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: golang 中神奇的 slice(https://links.jianshu.com/go?tohttps%3A%2F%2Fliqiang.io%2Fpost%2Fimagesliceingolang) 在 golang 中,似乎人们都不太喜欢使用 Linked List,甚至于原
godoc 命令和 golang 代码文档管理
介绍 godoc 是 golang 自带的文档查看器,更多的提供部署服务 go doc 和 godoc 在 golang 1.13 被移除了,可以自行安装 golang.org go1.13 godoc(https://links.jianshu.com/go?tohttps%3A%2F%2Fgolang.org%2Fdoc%2Fg
Mac安装Golang和vscode
Mac第一次安装golang和vscode一起使用,遇到了不少的坑,下面介绍一下正确的安装方式。 1、使用brew安装Golang 如果不知道brew是什么,或怎么安装请看这里 brew官网(https://brew.sh/index_zhcn) brew install golang 安装完成后可以使用
【Golang】GoWeb框架之Gin-简明教程
Gin 简介 Gin is a HTTP web framework written in Go (Golang). It features a
Golang中常用的字符串操作
Golang中常用的字符串操作 一、标准库相关的Package go import( "strings" ) 二、常用字符串操作 1. 判断是否为空字符串 1.1 使用“”进行判断 思路:直接判断是否等于""空字符串,由于Golang中字符串不能为 nil,且为值类型,所以直接与空字符串比较即可。 举例: go
golang 分析调试高阶技巧
layout: post title: “golang 调试高阶技巧” date: 2020603 1:44:09 0800 categories: golang GC 垃圾回收 golang 高阶调试 Golang tools nm compile
Golang duck typing(鸭子类型)的概念
“像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子” 描述事物的外部行为而非内部结构 严格说go属于结构化类型系统,类似dock typing 先看一个其他语言中的duck typing : python中的duck typing def download(retriever): return retriever
golang包循环引用的几种解决方案
golang包循环引用的几种解决方案 发表于2020年11月2日2020年11月3日(https://libuba.com/2020/11/02/golang%e5%8c%85%e5%be%aa%e7%8e%af%e5%bc%95%e7%94%a8%e7%9a%84%e5%87%a0%e7%a7%8d%e8%a7%
我的golang笔记
面向对象思想 面向对象简介 编程思想 与编程语言无关。 C语言、Go中的 结构体 就是后来面向对象编程语言中的类。 面向对象编程:高内聚,低耦合。 特性 继承 —— 匿名字段(实名字段) 封装 —— 方法 多态 —— 接口(interface) Go 语言是典型的面向对象编程语言。 通过程序描述对象 创建类(指定类属性) 类属性:静
我的golang基础
库查询 https://gowalker.org/你应该$HOME/.profile文件增加下面设置。 搭建go的环境 step1:去golang的官网下载go的安装包 windows:go1.9.2.....msi mac:go1.9.2......pkg 双击傻瓜式安装 linux:go1.9.2.linuxamd64.tar.gz 默认到下
GO开发[一]:golang语言初探
一.Golang的安装 1.https://dl.gocn.io/ (国内下载地址) (https://imghelloworld.osscnbeijing.aliyuncs.com/658c5d13c377
golang - DES加密ECB(模式)
Java默认DES算法使用DES/ECB/PKCS5Padding,而golang认为这种方式是不安全的,所以故意没有提供这种加密方式,那如果我们还是要用到怎么办?下面贴上golang版的DES ECB加密解密代码(默认对密文做了base64处理)。
聊聊golang的DDD项目结构
序本文主要研究一下golang的DDD项目结构interfacesfoodappserver/interfacesinterfaces git:(master) tree.|____fileupload| |____fileformat.go| |____fileupload.go|____food_handler.go|__
go get下载包失败问题
关于我由于某些不可抗力的原因,国内使用go get命令安装包时会经常会出现timeout的问题。本文介绍几个常用的解决办法。 从github克隆golang在github上建立了一个镜像库,如https://github.com/golang/net就对应是 https://golang.org/x/net的镜像库。 要下载golang.org/x/net包