Golang的interface及duck typing鸭子类型

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 意思就是: 一个东西究竟是不是鸭子,取决于它能不能满足鸭子的工作。

duck typing 多见于动态语言,例如PHP,Python等.

在静态语言中比较罕见,但是在go中duck typing处处都是duck typing.go的interface{}和duck typing密不可分.

原理说明

duck typing描述事物的外部行为而非内部结构

在面向对象的编程语言中,当某个地方(比如某个函数的参数)需要符合某个条件的变量(比如要求这个变量实现了某种方法)时,什么是判断这个变量是否“符合条件”的标准?

如果某种语言在这种情况下的标准是: 这个变量的类型是否实现了这个要求的方法(并不要求显式地声明),那么这种语言的类型系统就可以称为 duck typing

鸭子类型(英语:duck typing):

是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。

个人理解,谁调用谁实现,比如你要调用一个A函数,而A函数中接收参数的同时调用了参数中的B方法.这时候你就要传进去一个具有B方法名的一个对象.

代码案例

对比Python3的duck typing案例

#!/usr/local/bin/python3

# coding=utf8

# 使用的对象和方法

class PsyDuck(object):

def gaga(self):

print("这是可达鸭")

# 使用的对象和方法

class DoningdDuck(object):

def gaga(self):

print("这是唐老鸭")

# 被调用的函数

def duckSay(func):

return func.gaga()

# 限制调用方式

if __name__ != '__main__':

print("must __main__")

# 实例化对象

duck = PsyDuck()

person = DoningdDuck()

# 调用函数

duckSay(duck)

duckSay(person)

GoLang案例

package main

import "fmt"

//定义一个鸭子接口

//Go 接口是一组方法的集合,可以理解为抽象的类型。它提供了一种非侵入式的接口。任何类型,只要实现了该接口中方法集,那么就属于这个类型。

type Duck interface {

Gaga()

}

//假设现在有一个可达鸭类型

type PsyDuck struct{}

//可达鸭声明方法-满足鸭子会嘎嘎叫的特性

func (pd PsyDuck) Gaga() {

fmt.Println("this is PsyDuck")

}

//假设现在有一个唐老鸭类型

type DoningdDuck struct{}

//唐老鸭声明方法-满足鸭子会嘎嘎叫的特性

func (dd DoningdDuck) Gaga() {

fmt.Println("this is DoningdDuck")

}

//要调用的函数 - 负责执行鸭子能做的事情,注意这里的参数,有类型限制为Duck接口

func DuckSay(d Duck) {

d.Gaga()

}

func main() {

//提示开始打印

fmt.Println("duck typing")

//实例化对象

var pd PsyDuck//可达鸭类型

var dd DoningdDuck//唐老鸭类型

//调用方法

pd.Gaga()//因为可达鸭实现了所有鸭子的函数,所以可以这么用

dd.Gaga()因为唐老鸭实现了所有鸭子的函数,所以可以这么用

}

java实现鸭子类型,Golang的interface及duck typing鸭子类型相关推荐

  1. python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  2. Duck Typing (鸭子类型)详解

    1. 通俗解释: 之所以叫鸭子类型,是因为对于一个object来讲,如果它长得像鸭子,走路像鸭子,颜色像鸭子,那么你就可以把他当成一只鸭子 2. 在object oriental 里面的定义: Duc ...

  3. duck typing java_编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

  4. 编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

  5. Go 语言编程 — 高级数据类型 — Interface、多态、Duck Typing 与泛式编程

    目录 文章目录 目录 Golang 的接口 Interface 实例存储的是实现者的值 如何判断某个 Interface 实例的实际类型 Empty Interface Interface 与多态 I ...

  6. 编程语言中的 DUCK TYPING|python、c++、java、go

    如果一只动物走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只动物就可以被称为鸭子. 许多编程语言都支持 Duck Typing ,通常 Duck Typing 是动态编程语言用来实现多态的一种方 ...

  7. GoLang之interface底层系列二(类型断言)

    文章目录 GoLang之interface底层系列二(类型断言) 1.抽象类型.具体类型 2.断言的作用类型与目标类型 3.空接口.(具体类型) 4.非空接口.(具体类型) 5.空接口.(非空接口) ...

  8. golang语言 []interface{}和interface{}

    文章目录 golang语言 []interface{} interface(接口) interface应用场景 interface{} 空接口 []interface{} golang中为什么[]st ...

  9. Python笔记 · 鸭子类型 / Duck Typing

    1. 问题的由来 我初次意识到鸭子类型的存在是在学习Sklearn时,在<Hands-On Machine Learing>一书的第二章,作者提供了一个自定义的Tansformer,使用自 ...

最新文章

  1. 安全***需要掌握的东西
  2. 17秋 软件工程 团队第五次作业 Alpha
  3. Java Annotations: Explored Explained--转载
  4. (12)高斯和均值模糊放到一起
  5. html text 默认选中,html - 如何在Shiny中默认选择verbatimTextOutput中的文本? - SO中文参考 - www.soinside.com...
  6. router-link标签学习
  7. 动态规划训练15 [Monkey and Banana HDU - 1069 ]
  8. 自动化C语言第一次月考试卷,计算机专业第一次月考.doc
  9. Linux PS 命令详解
  10. 集群资源分配_推荐一款MySQL日常运维和集群管理的自动化平台--Arkcontrol
  11. matlab两个曲线的名称怎么显示出来的,求MATLAB的高手,怎么把两张仿真曲线合并显示在一张图上?...
  12. Shell脚本编程之(一)Shell脚本简介
  13. [张国荣][21CD][1998-2002][APE+CUE][8.00G][115][sqhhj0622#HD2PT]
  14. 「面试必背」TCP,UDP,Socket,Http网络编程面试题(快收藏)
  15. 小技巧(7):WPS批量修改图片尺寸
  16. 魔方——一面两层之后的公式
  17. HCIA-Cloud Computing华为云计算IA认证笔记
  18. 推荐几款不错的企业网站,前端设计师寻求设计灵感!
  19. 倍福---Profinet主从通信
  20. URL 编码 - 从 %00 到 %ff

热门文章

  1. python数据处理框架_python 最快 web 框架 Sanci 快速入门
  2. linux远程windows执行cmd,Linux服务器远程连接window服务器并执行cmd命令
  3. mysql总结 博客园_mysql 总结
  4. java 获取oracle表结构_获取Oracle中所有表的列表?
  5. win7系统怎么查看主板信息
  6. cv2 imwrite中文路径_python3下使用cv2.imwrite存储带有中文路径图片的方法
  7. Showdoc使用——接口文档
  8. JAVA之private修饰成员方法默认是final型的?
  9. Springboot Mybatis使用PageHelper实现分页查询
  10. 三步教你解决Invalid bound statement (not found): com.xxx.dao.xxxDao.selectByxx错误!!!!很简单